學習Android的第二十一天

目錄

Android ProgressDialog (進度條對話框)

例子

Android DatePickerDialog 日期選擇對話框

例子

Android TimePickerDialog 時間選擇對話框

Android PopupWindow 懸浮框

構造函數

方法

例子

官方文檔

Android OptionMenu 選項菜單

例子

官方文檔


Android ProgressDialog (進度條對話框)

Android ProgressDialog 已經在 API 26+ 中被廢棄,ProgressDialog 不能直接從 XML 里創建。

例子

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"android:layout_width="match_parent"android:layout_height="match_parent"xmlns:tools="http://schemas.android.com/tools"android:orientation="vertical"android:gravity="center"tools:context=".MainActivity"><Buttonandroid:id="@+id/btn_show_normal_progress_dialog"android:layout_width="wrap_content"android:layout_height="wrap_content"android:text="顯示普通ProgressDialog" /><Buttonandroid:id="@+id/btn_show_indeterminate_progress_dialog"android:layout_width="wrap_content"android:layout_height="wrap_content"android:text="顯示不確定結束的ProgressDialog" /><Buttonandroid:id="@+id/btn_show_determinate_progress_dialog"android:layout_width="wrap_content"android:layout_height="wrap_content"android:text="顯示確定結束的ProgressDialog" /></LinearLayout>
package com.example.myapplication;import android.app.ProgressDialog;
import android.os.Bundle;
import android.os.Handler;
import android.view.View;
import android.widget.Button;import androidx.appcompat.app.AppCompatActivity;public class MainActivity extends AppCompatActivity {private ProgressDialog progressDialog;@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.activity_main);Button btnShowNormal = findViewById(R.id.btn_show_normal_progress_dialog);Button btnShowIndeterminate = findViewById(R.id.btn_show_indeterminate_progress_dialog);Button btnShowDeterminate = findViewById(R.id.btn_show_determinate_progress_dialog);btnShowNormal.setOnClickListener(v -> {showProgressDialog(ProgressDialog.STYLE_SPINNER); // 普通ProgressDialog});btnShowIndeterminate.setOnClickListener(v -> {showProgressDialog(ProgressDialog.STYLE_HORIZONTAL); // 不確定結束的ProgressDialog});btnShowDeterminate.setOnClickListener(v -> {showDeterminateProgressDialog(); // 確定結束的ProgressDialog});}private void showProgressDialog(int style) {progressDialog = new ProgressDialog(MainActivity.this);progressDialog.setTitle("軟件更新中");progressDialog.setMessage("軟件正在更新中,請稍后...");progressDialog.setProgressStyle(style);progressDialog.setCancelable(false); // 防止用戶取消progressDialog.show();// 模擬操作new Handler().postDelayed(() -> {progressDialog.dismiss();}, 3000); // 模擬3秒后關閉對話框}private void showDeterminateProgressDialog() {progressDialog = new ProgressDialog(MainActivity.this);progressDialog.setTitle("軟件更新中");progressDialog.setMessage("軟件正在更新中,請稍后...");progressDialog.setProgressStyle(ProgressDialog.STYLE_HORIZONTAL);progressDialog.setMax(100); // 設置最大值progressDialog.setCancelable(false);progressDialog.show();// 模擬下載進度更新new Thread(() -> {int progress = 0;while (progress <= 100) {progressDialog.setProgress(progress);progress += 10;try {Thread.sleep(500); // 模擬下載延遲} catch (InterruptedException e) {e.printStackTrace();}}progressDialog.dismiss();}).start();}
}

Android DatePickerDialog 日期選擇對話框

當用戶點擊一個按鈕,彈出日期選擇對話框是一個常見的需求。

例子

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"android:layout_width="match_parent"android:layout_height="match_parent"xmlns:tools="http://schemas.android.com/tools"android:orientation="vertical"android:gravity="center"tools:context=".MainActivity"><Buttonandroid:id="@+id/btn_pick_date"android:layout_width="wrap_content"android:layout_height="wrap_content"android:text="選擇日期"/></LinearLayout>
package com.example.myapplication;import android.app.DatePickerDialog;
import android.os.Bundle;
import android.widget.Button;import androidx.appcompat.app.AppCompatActivity;import java.util.Calendar;public class MainActivity extends AppCompatActivity {private Button btnPickDate;@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.activity_main);btnPickDate = findViewById(R.id.btn_pick_date);btnPickDate.setOnClickListener(v -> showDatePickerDialog());}private void showDatePickerDialog() {// 獲取當前日期Calendar calendar = Calendar.getInstance();int year = calendar.get(Calendar.YEAR);int month = calendar.get(Calendar.MONTH);int day = calendar.get(Calendar.DAY_OF_MONTH);// 創建并顯示日期選擇對話框DatePickerDialog datePickerDialog = new DatePickerDialog(this, (view, selectedYear, selectedMonth, selectedDay) -> {// 處理選擇的日期String selectedDate = selectedYear + "-" + (selectedMonth + 1) + "-" + selectedDay;btnPickDate.setText(selectedDate); // 在按鈕上顯示選擇的日期}, year, month, day);datePickerDialog.show();}
}

Android TimePickerDialog 時間選擇對話框

Android TimePickerDialog ( 時間選擇對話框 ) 會彈出一個對話框形式的時間選擇器。

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"android:layout_width="match_parent"android:layout_height="match_parent"xmlns:tools="http://schemas.android.com/tools"android:orientation="vertical"android:gravity="center"tools:context=".MainActivity"><Buttonandroid:id="@+id/btn_pick_time"android:layout_width="wrap_content"android:layout_height="wrap_content"android:text="選擇時間"/></LinearLayout>
package com.example.myapplication;import android.app.TimePickerDialog;
import android.os.Bundle;
import android.widget.Button;import androidx.appcompat.app.AppCompatActivity;import java.util.Calendar;
import java.util.TimeZone;public class MainActivity extends AppCompatActivity {private Button btnPickTime;@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.activity_main);btnPickTime = findViewById(R.id.btn_pick_time);btnPickTime.setOnClickListener(v -> showTimePickerDialog());}private void showTimePickerDialog() {// 獲取中國的當前時間Calendar calendar = Calendar.getInstance(TimeZone.getTimeZone("GMT+08:00")); // 設置時區為中國標準時間int hour = calendar.get(Calendar.HOUR_OF_DAY);int minute = calendar.get(Calendar.MINUTE);// 創建并顯示時間選擇對話框TimePickerDialog timePickerDialog = new TimePickerDialog(this, (view, selectedHour, selectedMinute) -> {// 處理選擇的時間String selectedTime = String.format("%02d:%02d", selectedHour, selectedMinute);btnPickTime.setText(selectedTime); // 在按鈕上顯示選擇的時間}, hour, minute, true); // 最后一個參數表示是否為24小時制timePickerDialog.show();}
}

Android PopupWindow 懸浮框

PopupWindow 是一個彈出窗口控件,可以顯示任意 View,并且浮動在當前 Activity 的頂部。通常用于懸浮在其他 UI 控件旁邊,提供額外的信息或操作選項。與 AlertDialog 不同,PopupWindow 的位置可以自由設置,可以根據需要顯示在屏幕的任何位置。

構造函數

PopupWindow 類的構造函數如下:

  1. PopupWindow(): 創建一個空的 PopupWindow 對象。
  2. PopupWindow(Context context): 使用指定的上下文創建 PopupWindow 對象。
  3. PopupWindow(Context context, AttributeSet attrs): 使用指定的上下文和屬性集創建 PopupWindow 對象。
  4. PopupWindow(Context context, AttributeSet attrs, int defStyleAttr): 使用指定的上下文、屬性集和樣式資源創建 PopupWindow 對象。
  5. PopupWindow(Context context, AttributeSet attrs, int defStyleAttr, int defStyleRes): 使用指定的上下文、屬性集、樣式資源和主題資源創建 PopupWindow 對象。
  6. PopupWindow(View contentView): 使用指定的內容視圖創建 PopupWindow 對象。
  7. PopupWindow(int width, int height): 創建指定寬高的 PopupWindow 對象。
  8. PopupWindow(View contentView, int width, int height): 使用指定的內容視圖以及寬高創建 PopupWindow 對象。
  9. PopupWindow(View contentView, int width, int height, boolean focusable): 使用指定的內容視圖、寬高和焦點設置創建 PopupWindow 對象。

方法

以下是一些重要的 PopupWindow 方法的說明:

  1. setContentView(View contentView): 設置 PopupWindow 顯示的 View。
  2. getContentView(): 獲取 PopupWindow 顯示的 View。
  3. showAsDropDown(View anchor): 在指定控件正下方顯示 PopupWindow,無偏移。
  4. showAsDropDown(View anchor, int xoff, int yoff): 在指定控件位置顯示 PopupWindow,并可以設置偏移量。
  5. showAtLocation(View parent, int gravity, int x, int y): 在父控件指定位置顯示 PopupWindow,可以設置具體位置、偏移量等。需要傳入 Activity 中的任意一個 View 作為 parent 參數。
  6. setWidth(int width) / setHeight(int height): 設置 PopupWindow 的寬度和高度,也可以在構造方法中指定。
  7. setFocusable(true): 設置 PopupWindow 是否具有焦點。當設置為 true 時,PopupWindow 彈出后會處理觸摸事件和物理按鍵事件,必須先讓 PopupWindow 消失才能響應其他事件。
  8. setAnimationStyle(int style): 設置 PopupWindow 彈出和消失的動畫效果。

例子

1、創建 res/layout/popup_content.xml 布局文件:

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"android:layout_width="wrap_content"android:layout_height="wrap_content"android:orientation="vertical"android:padding="16dp"><TextViewandroid:layout_width="wrap_content"android:layout_height="wrap_content"android:text="彈出內容"android:textSize="16sp"android:textColor="@android:color/black" /><Buttonandroid:id="@+id/close_button"android:layout_width="wrap_content"android:layout_height="wrap_content"android:text="關閉"android:textColor="@android:color/white"android:background="@color/purple" />
</LinearLayout>

2、修改 res/layout/activity_main.xml 布局文件:

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"android:layout_width="match_parent"android:layout_height="match_parent"xmlns:tools="http://schemas.android.com/tools"android:orientation="vertical"android:gravity="center"tools:context=".MainActivity"><Buttonandroid:id="@+id/show_popup_button"android:layout_width="wrap_content"android:layout_height="wrap_content"android:text="顯示彈出菜單" /></LinearLayout>

3、修改 MainActivity.java:

package com.example.myapplication;import android.os.Bundle;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.Button;
import android.widget.PopupWindow;import androidx.appcompat.app.AppCompatActivity;public class MainActivity extends AppCompatActivity {private PopupWindow popupWindow;@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.activity_main);// 創建一個 View 作為 PopupWindow 的內容視圖View contentView = LayoutInflater.from(this).inflate(R.layout.popup_content, null);// 創建 PopupWindow 對象并設置內容視圖、寬高popupWindow = new PopupWindow(contentView, ViewGroup.LayoutParams.WRAP_CONTENT, ViewGroup.LayoutParams.WRAP_CONTENT);// 設置焦點,讓 PopupWindow 彈出后處理觸摸事件和物理按鍵事件popupWindow.setFocusable(true);// 找到觸發彈出 PopupWindow 的按鈕Button showPopupButton = findViewById(R.id.show_popup_button);showPopupButton.setOnClickListener(new View.OnClickListener() {@Overridepublic void onClick(View v) {// 在按鈕下方顯示 PopupWindow,無偏移popupWindow.showAsDropDown(v);}});// 找到關閉 PopupWindow 的按鈕Button closeButton = contentView.findViewById(R.id.close_button);closeButton.setOnClickListener(new View.OnClickListener() {@Overridepublic void onClick(View v) {// 關閉 PopupWindowpopupWindow.dismiss();}});}
}

官方文檔

  1. Android PopupWindow

Android OptionMenu 選項菜單

在Android中,OptionMenu(選項菜單)的創建和管理不是通過XML直接實例化或某個類的實例化方法實現的,而是通過Activity提供的幾個生命周期方法進行動態創建和控制。

具體來說:

  • onCreateOptionsMenu(Menu menu):這是用于初始化選項菜單的方法,在這個方法里,我們可以調用getMenuInflater().inflate(R.menu.menu_main, menu);來加載預定義在XML文件中的菜單項,或者通過調用menu對象的add()方法動態添加菜單項。
  • onOptionsItemSelected(MenuItem item):當用戶點擊選項菜單中的某一項時,系統會調用此方法,我們可以在其中根據item的id進行相應的操作處理。
  • onPrepareOptionsMenu(Menu menu):在每次菜單即將顯示前,系統都會調用此方法,以便我們可以根據當前應用的狀態動態修改菜單項的狀態或可見性等屬性。
  • onOptionsMenuClosed(Menu menu):當選項菜單關閉后,系統會調用此回調方法,可以在此處執行菜單關閉后的清理工作。
  • onMenuOpened(int featureId, Menu menu):如果我們的應用支持舊版的API(如ActionBar的子菜單),當選項菜單打開時,系統可能會調用此方法通知我們菜單已打開。

例子

1、在 res/menu/menu_main.xml 菜單文件中定義要顯示的菜單項:

<!-- menu_main.xml -->
<menu xmlns:android="http://schemas.android.com/apk/res/android"><itemandroid:id="@+id/menu_item1"android:title="選項 1" /><itemandroid:id="@+id/menu_item2"android:title="選項 2" />
</menu>

2、修改 res/layout/activity_main.xml 布局文件:

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"android:layout_width="match_parent"android:layout_height="match_parent"xmlns:tools="http://schemas.android.com/tools"android:orientation="vertical"android:gravity="center"tools:context=".MainActivity"><Buttonandroid:id="@+id/open_popup_menu_button"android:layout_width="wrap_content"android:layout_height="wrap_content"android:text="顯示彈出菜單" /></LinearLayout>

3、修改 MainActivity.java:

package com.example.myapplication;import android.os.Bundle;
import android.view.MenuItem;
import android.widget.Button;
import android.widget.PopupMenu;
import android.widget.Toast;import androidx.appcompat.app.AppCompatActivity;public class MainActivity extends AppCompatActivity {@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.activity_main);Button openPopupMenuButton = findViewById(R.id.open_popup_menu_button);openPopupMenuButton.setOnClickListener(v -> {PopupMenu popupMenu = new PopupMenu(MainActivity.this, openPopupMenuButton);popupMenu.getMenuInflater().inflate(R.menu.menu_main, popupMenu.getMenu());popupMenu.setOnMenuItemClickListener(item -> {int id = item.getItemId();if (id == R.id.menu_item1) {// 處理選中 選項 1 的事件Toast.makeText(MainActivity.this, "選擇了選項1", Toast.LENGTH_SHORT).show();return true;} else if (id == R.id.menu_item2) {// 處理選中 選項 2 的事件Toast.makeText(MainActivity.this, "選擇了選項2", Toast.LENGTH_SHORT).show();return true;}return false;});popupMenu.show();});}
}

官方文檔

  1. Android menus

?

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/714548.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/714548.shtml
英文地址,請注明出處:http://en.pswp.cn/news/714548.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

Java實戰:Spring Boot中各類參數校驗機制

引言 在開發Web應用程序時&#xff0c;對客戶端傳入的參數進行有效校驗是保證系統安全性和穩定性的重要環節。Spring Boot作為一個現代化的Java開發框架&#xff0c;提供了多種參數校驗的方法和工具&#xff0c;以滿足不同場景下的需求。本文將深入探討Spring Boot中實現各種參…

typescript 的常用方式

文章目錄 前言一、綁定props 默認值的方式&#xff1a;withDefaults1.vue2 的props設置默認值2.vue3 的props設置默認值(1) 不設置默認值的寫法(2) 設置默認值的寫法&#xff08;分離模式&#xff09;(3) 設置默認值的寫法&#xff08;組合模式&#xff09; 二、定義一個二維數…

Matlab在同一張圖中如何加入多個圖例

根據代碼最終畫出的圖片如下&#xff1a; 其實原理很簡單&#xff0c;就是在一張figure中畫多個坐標軸&#xff0c;每個坐標軸都有對應的圖例&#xff0c;之后再將多余坐標軸隱藏&#xff0c;只保留一個即可。 代碼如下&#xff1a; clear all; close all;dd_linewidth 1;a …

maven archetype 項目原型

拓展閱讀 maven 包管理平臺-01-maven 入門介紹 Maven、Gradle、Ant、Ivy、Bazel 和 SBT 的詳細對比表格 maven 包管理平臺-02-windows 安裝配置 mac 安裝配置 maven 包管理平臺-03-maven project maven 項目的創建入門 maven 包管理平臺-04-maven archetype 項目原型 ma…

Spring學習筆記(六)利用Spring的jdbc實現學生管理系統的用戶登錄功能

一、案例分析 本案例要求學生在控制臺輸入用戶名密碼&#xff0c;如果用戶賬號密碼正確則顯示用戶所屬班級&#xff0c;如果登錄失敗則顯示登錄失敗。 &#xff08;1&#xff09;為了存儲學生信息&#xff0c;需要創建一個數據庫。 &#xff08;2&#xff09;為了程序連接數…

洛谷P1927防護傘

題目描述 據說 20122012 的災難和太陽黑子的爆發有關。于是地球防衛小隊決定制造一個特殊防護傘&#xff0c;擋住太陽黑子爆發的區域&#xff0c;減少其對地球的影響。由于太陽相對于地球來說實在是太大了&#xff0c;我們可以把太陽表面看作一個平面&#xff0c;中心定為(0,0…

C 基本語法

我們已經看過 C 程序的基本結構&#xff0c;這將有助于我們理解 C 語言的其他基本的構建塊。 C 的令牌&#xff08;Token&#xff09; C 程序由各種令牌組成&#xff0c;令牌可以是關鍵字、標識符、常量、字符串值&#xff0c;或者是一個符號。例如&#xff0c;下面的 C 語句…

30天自制操作系統(第23天)

23.1 編寫malloc 參考第22天的內容&#xff0c;在繪制窗口前先分配了150*50個字節大小的內存&#xff0c;所以導致該文件經編譯后有7.6k左右&#xff0c;能否在其中使用指針呢&#xff1f;當需要開辟空間時&#xff0c;移動指針即可。在之前的章節中也有函數memman_alloc函數可…

php源碼 單色bmp圖片取模工具 按任意方式取模 生成字節數組 自由編輯點陣

http://2.wjsou.com/BMP/index.html 想試試chatGPT4生成&#xff0c;還是要手工改 php 寫一個網頁界面上可以選擇一張bmp圖片&#xff0c;界面上就顯示這張bmp圖片&#xff0c; 點生成取模按鈕&#xff0c;在圖片下方會顯示這張bmp圖片的取模數據。 取模規則是按界面設置的&a…

Linux 的交換空間(swap)是什么?有什么用?

目錄 swap是什么&#xff1f;swap有什么用&#xff1f;swap使用典型場景如何查看你的系統是否用到交換空間呢&#xff1f;查看系統中swap in/out的情況 swap是什么&#xff1f; swap就是磁盤上的一塊區域。它和Windows系統中的交換文件作用類似&#xff0c;但是它是一段連續的…

03、MongoDB -- MongoDB 權限的設計

目錄 MongoDB 權限的設計演示前準備&#xff1a;啟動 mongodb 服務器 和 客戶端 &#xff1a;1、啟動單機模式的 mongodb 服務器2、啟動 mongodb 的客戶端 MongoDB 權限的設計1、MongoDB 的每個數據庫都可以保存用戶&#xff0c;不止admin數據庫可以保存用戶。2、保存用戶的數據…

Linux 學習筆記(8)

八、 啟動引導 1 、 Linux 的啟動流程 1) BIOS 自檢 2) 啟動 GRUB/LILO 3) 運行 Linux kernel 并檢測硬件 4) 掛載根文件系統 5) 運行 Linux 系統的第一個進程 init( 其 PID 永遠為 1 &#xff0c;是所有其它進程的父進程 ) 6) init 讀取系統引導配置文件…

GD25Q32驅動

GD25Q32是一款基于SPI的Flash芯片&#xff0c;容量為32/84M bytes。它的引腳如下&#xff1a; 該芯片支持多種SPI操作方式&#xff0c;包括&#xff1a;Standard SPI(標準SPI)、Dual SPI(雙線 SPI)和Quad SPI(四線 SPI) 。有關SPI的介紹可以參考&#xff1a; SPI通信原理-CSDN…

flutter 文字一行顯示,超出換行

因為app有多語言&#xff0c;中文和其他語言長度不一致&#xff0c;可能導致英文會很長。 中文樣式 英文樣式 代碼 Row(mainAxisAlignment: MainAxisAlignment.end,crossAxisAlignment: CrossAxisAlignment.end,children: [Visibility(visible: controller.info.fee ! null,ch…

探尋2024年國內熱門低代碼平臺排行!| 功能特點一覽

低代碼開發是一項革命性的技術&#xff0c;主要目的是盡量避免程序研發的復雜性&#xff0c;讓外行開發者也能加入到應用程序的搭建中。低代碼平臺的核心概念和構成部分通常包括用戶界面和拖拽設計、預構件和模塊、自動化工作內容與數據庫集成和擴展應用&#xff0c;應用低代碼…

web前端css基本內容

web前端css 當我們用html的語法給內容規劃布局樣式時&#xff0c;可能會出現許多個相似的內容需要運用同一種樣式&#xff0c;復制粘貼太麻煩而且如果后期要改動的話比如把許多個地方從紅色改成藍色&#xff0c;就需要一個一個改了&#xff0c;這時候就需要引入css來操作了 把…

java-使用jacob刪除指定文件夾的郵件

總結見文章最后,具體代碼如下: ActiveXComponent outlook = new ActiveXComponent("Outlook.Application");Dispatch myNamespace = Dispatch.call(outlook, "GetNamespace", "MAPI").toDispatch();//指定搜索特定的文件Dispatch allFolders =…

我耀學IT—day05-Bootstrap下拉菜單與導航

一、Bootstrap5 下拉菜單 下拉菜單是可切換的&#xff0c;是以列表格式顯示鏈接的上下文菜單。 例&#xff1a; <div class"dropdown"><button type"button" class"btn btn-primary dropdown-toggle" data-bs-toggle"dropdown&…

U盤彈出提示“該設備正在使用中”:原因與解決方案

在日常使用U盤時&#xff0c;我們可能會遇到一個問題&#xff1a;當嘗試安全彈出U盤時&#xff0c;系統提示“該設備正在使用中”。這種情況可能會讓用戶感到困惑&#xff0c;擔心數據是否安全或是否會導致U盤損壞。本文旨在探討這一現象背后的原因&#xff0c;并提供相應的解決…

【前端素材】推薦優質后臺管理系統網頁Stisla平臺模板(附源碼)

一、需求分析 1、系統定義 后臺管理系統是一種用于管理和控制網站、應用程序或系統的管理界面。它通常被設計用來讓網站或應用程序的管理員或運營人員管理內容、用戶、數據以及其他相關功能。后臺管理系統是一種用于管理網站、應用程序或系統的工具&#xff0c;通常由管理員使…