Android:Dialog的使用詳解

Android中Dialog的使用詳解

Dialog(對話框)是Android中常用的UI組件,用于臨時顯示重要信息或獲取用戶輸入。

1. 基本Dialog類型

1.1 AlertDialog(警告對話框)

最常用的對話框類型,可以設置標題、消息、按鈕等:

new AlertDialog.Builder(this).setTitle("提示").setMessage("確定要刪除此項嗎?").setPositiveButton("確定", new DialogInterface.OnClickListener() {@Overridepublic void onClick(DialogInterface dialog, int which) {// 確定按鈕點擊事件}}).setNegativeButton("取消", null).setNeutralButton("稍后提醒", null).show();

1.2 ProgressDialog(進度對話框,已廢棄)

?? 注意:ProgressDialog在API 26中已廢棄,推薦使用ProgressBar

替代方案:

// 使用ProgressBar在布局中實現
AlertDialog.Builder builder = new AlertDialog.Builder(this);
builder.setView(R.layout.progress_dialog_layout);
AlertDialog dialog = builder.create();
dialog.show();

1.3 DatePickerDialog/TimePickerDialog(日期/時間選擇對話框)

// 日期選擇對話框
DatePickerDialog datePickerDialog = new DatePickerDialog(this, new DatePickerDialog.OnDateSetListener() {@Overridepublic void onDateSet(DatePicker view, int year, int month, int dayOfMonth) {// 處理選擇的日期}}, 2023, 0, 1); // 初始年、月、日
datePickerDialog.show();// 時間選擇對話框
TimePickerDialog timePickerDialog = new TimePickerDialog(this,new TimePickerDialog.OnTimeSetListener() {@Overridepublic void onTimeSet(TimePicker view, int hourOfDay, int minute) {// 處理選擇的時間}}, 12, 0, true); // 初始小時、分鐘,是否24小時制
timePickerDialog.show();

2. 自定義Dialog

2.1 使用自定義布局

AlertDialog.Builder builder = new AlertDialog.Builder(this);
LayoutInflater inflater = getLayoutInflater();
View dialogView = inflater.inflate(R.layout.custom_dialog_layout, null);
builder.setView(dialogView);// 獲取自定義布局中的控件
EditText editText = dialogView.findViewById(R.id.dialog_edittext);
Button button = dialogView.findViewById(R.id.dialog_button);AlertDialog dialog = builder.create();
dialog.show();button.setOnClickListener(v -> {String input = editText.getText().toString();// 處理輸入dialog.dismiss();
});

2.2 繼承Dialog類創建完全自定義對話框

public class CustomDialog extends Dialog {public CustomDialog(@NonNull Context context) {super(context);setContentView(R.layout.custom_dialog_layout);Button closeButton = findViewById(R.id.close_button);closeButton.setOnClickListener(v -> dismiss());// 設置對話框窗口屬性Window window = getWindow();if (window != null) {window.setBackgroundDrawable(new ColorDrawable(Color.TRANSPARENT));WindowManager.LayoutParams params = window.getAttributes();params.width = WindowManager.LayoutParams.MATCH_PARENT;params.height = WindowManager.LayoutParams.WRAP_CONTENT;window.setAttributes(params);}}
}// 使用
CustomDialog customDialog = new CustomDialog(MainActivity.this);
customDialog.show();

3. DialogFragment(推薦方式)

DialogFragment是管理對話框生命周期的更好方式,特別是在Activity重建時:

public class MyDialogFragment extends DialogFragment {// 對話框邏輯將在這里實現
}

方式一:使用自定義布局(重寫onCreateView)

Copy
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,Bundle savedInstanceState) {// 膨脹自定義布局View view = inflater.inflate(R.layout.fragment_dialog, container, false);// 初始化視圖組件Button button = view.findViewById(R.id.button);button.setOnClickListener(v -> {// 處理點擊事件dismiss(); // 關閉對話框});return view;
}

在Activity中顯示對話框:

MyDialogFragment dialogFragment = new MyDialogFragment();
dialogFragment.show(getSupportFragmentManager(), "MyDialogFragment");

使用AlertDialog(重寫onCreateDialog)

使用AlertDialog(重寫onCreateDialog)
public class MyDialogFragment extends DialogFragment {@NonNull@Overridepublic Dialog onCreateDialog(Bundle savedInstanceState) {AlertDialog.Builder builder = new AlertDialog.Builder(getActivity());builder.setTitle("DialogFragment示例").setMessage("這是一個使用DialogFragment創建的對話框").setPositiveButton("確定", (dialog, id) -> {// 確定按鈕點擊事件}).setNegativeButton("取消", (dialog, id) -> {// 取消按鈕點擊事件});return builder.create();}
}// 顯示DialogFragment
MyDialogFragment dialogFragment = new MyDialogFragment();
dialogFragment.show(getSupportFragmentManager(), "my_dialog_tag");

帶參數的DialogFragment

public class CustomDialogFragment extends DialogFragment {private static final String ARG_TITLE = "title";private static final String ARG_MESSAGE = "message";public static CustomDialogFragment newInstance(String title, String message) {CustomDialogFragment fragment = new CustomDialogFragment();Bundle args = new Bundle();args.putString(ARG_TITLE, title);args.putString(ARG_MESSAGE, message);fragment.setArguments(args);return fragment;}@NonNull@Overridepublic Dialog onCreateDialog(Bundle savedInstanceState) {Bundle args = getArguments();String title = args != null ? args.getString(ARG_TITLE) : "";String message = args != null ? args.getString(ARG_MESSAGE) : "";return new AlertDialog.Builder(getActivity()).setTitle(title).setMessage(message).setPositiveButton("OK", null).create();}
}// 使用
CustomDialogFragment dialog = CustomDialogFragment.newInstance("標題", "消息內容");
dialog.show(getSupportFragmentManager(), "custom_dialog");

4. 對話框樣式和主題

4.1 使用自定義主題

在styles.xml中定義:

<style name="CustomDialogTheme" parent="Theme.AppCompat.Light.Dialog.Alert"><item name="colorPrimary">@color/colorPrimary</item><item name="colorAccent">@color/colorAccent</item><item name="android:windowBackground">@android:color/transparent</item><item name="android:windowNoTitle">true</item>
</style>

使用主題:

AlertDialog.Builder builder = new AlertDialog.Builder(this, R.style.CustomDialogTheme);

4.2 設置對話框寬度和動畫

AlertDialog dialog = builder.create();
dialog.show();// 設置對話框寬度
Window window = dialog.getWindow();
if (window != null) {window.setLayout(ViewGroup.LayoutParams.MATCH_PARENT, ViewGroup.LayoutParams.WRAP_CONTENT);// 設置動畫window.setWindowAnimations(R.style.DialogAnimation);
}

5. 對話框生命周期管理

使用DialogFragment可以更好地管理對話框生命周期:

public class LifecycleDialogFragment extends DialogFragment {@Overridepublic void onCreate(@Nullable Bundle savedInstanceState) {super.onCreate(savedInstanceState);// 初始化操作}@Overridepublic void onStart() {super.onStart();// 對話框顯示時的操作}@Overridepublic void onDismiss(@NonNull DialogInterface dialog) {super.onDismiss(dialog);// 對話框關閉時的操作}@Overridepublic void onCancel(@NonNull DialogInterface dialog) {super.onCancel(dialog);// 用戶按返回鍵或點擊外部取消時的操作}
}

6. 最佳實踐

  1. 優先使用DialogFragment:它比直接使用Dialog能更好地處理配置變更和生命周期
  2. 避免阻塞操作:不要在對話框按鈕點擊事件中執行耗時操作
  3. 保持簡潔:對話框應專注于單一任務
  4. 考慮無障礙性:為對話框添加適當的內容描述和焦點管理
  5. 測試不同場景:包括旋轉設備、低內存等情況下的對話框行為

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

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

相關文章

arinc818 fpga單色圖像傳輸ip

arinc818協議支持的常用線速率如下圖 隨著圖像分辨率的提高&#xff0c;單lane的速率無法滿足特定需求&#xff0c;一種方式是通過多個LANE交叉的去傳輸圖像&#xff0c;另外一種是通過降低圖像的帶寬&#xff0c;即通過只傳單色圖像達到對應的效果 程序架構如下圖所示&#x…

透視投影(Perspective projection)與等距圓柱投影(Equirectangular projection)

一、透視投影 1.方法概述 Perspective projection&#xff08;透視投影&#xff09;是一種模擬人眼觀察三維空間物體時的視覺效果的投影方法。它通過模擬觀察者從一個特定視點觀察三維場景的方式來創建二維圖像。在透視投影中&#xff0c;遠處的物體看起來比近處的物體小&…

三.微服務架構中的精妙設計:服務注冊/服務發現-Eureka

一.使用注冊中心背景 1.1服務遠程調用問題 服務之間遠程調?時, 我們的URL是寫死的 String url "http://127.0.0.1:9090/product/" orderInfo.getProductId(); 缺點&#xff1a; 當更換機器, 或者新增機器時, 這個URL就需要跟著變更, 就需要去通知所有的相關服…

FPGA實現4K MIPI視頻解碼H265壓縮網絡推流輸出,基于IMX317+VCU架構,支持4K60幀,提供工程源碼和技術支持

目錄 1、前言工程概述免責聲明 2、相關方案推薦我已有的所有工程源碼總目錄----方便你快速找到自己喜歡的項目我這里已有的 MIPI 編解碼方案我這里已有的視頻圖像編解碼方案 3、詳細設計方案設計框圖FPGA開發板IMX317攝像頭MIPI D-PHYMIPI CSI-2 RX Subsystem圖像預處理Sensor …

Ollama+open-webui搭建私有本地大模型詳細教程

Ollamaopen-webui搭建私有本地大模型詳細教程 1. 什么是 Ollama&#xff1f; 1.1. Ollama 簡介 ? Ollama 是一個輕量級的 AI 模型運行時&#xff0c;專注于簡化 AI 模型的部署和使用。它支持多種預訓練模型&#xff08;如 Llama、Vicuna、Dolly 等&#xff09;&#xff0c;…

解決Centos7集成IDEA報git版本太低問題

Centos 7 服務器上默認安裝的 Git 是 1.8.3.1 版本的 與最新的IDEA已無法匹配&#xff0c;需要更新 首先&#xff0c;卸載老版本 sudo yum -y remove git sudo yum -y remove git-*添加 End Point 到 CentOS 7 倉庫 sudo yum -y install https://packages.endpointdev.com/r…

Qt常用宏定義判斷大全

Qt 提供了一系列預定義宏用于判斷 Qt 版本、操作系統平臺、編譯器特性等。這些宏在跨平臺開發中非常有用。 1. Qt 版本判斷宏 // 檢查Qt版本 #if QT_VERSION > QT_VERSION_CHECK(5, 15, 0)// Qt 5.15.0及以上版本特有代碼 #endif// 常用版本判斷 #if QT_VERSION > QT_V…

實戰 | 餐廳點餐小程序技術解析:SpringBoot + UniApp 高效開發指南

&#x1f5a5;? 一、系統架構概覽 1.1 技術選型 為了確保開發效率和系統穩定性&#xff0c;我們采用以下技術棧&#xff1a; 模塊技術選型后臺服務SpringBoot MyBatis-Plus MySQL用戶端&#xff08;點餐小程序&#xff09;UniApp&#xff08;Vue 語法&#xff09;師傅端&…

實現在Unity3D中仿真汽車,而且還能使用ros2控制

文章目錄 前言&#xff08;Introduction&#xff09;搭建開發環境&#xff08;Setup Development Environment&#xff09;在window中安裝Unity&#xff08;Install Unity in window&#xff09;創建Docker容器&#xff0c;并安裝相關軟件&#xff08;Create Docker containers…

華為配置篇-BGP實驗

BGP 一、簡述二、常用命令總結三、實驗 一、簡述 IBGP 水平分割&#xff1a;從一個 IBGP 對等體學到的路由&#xff0c;不會再通告給其他的 IBGP 對等體。在一個 AS 內部&#xff0c;路由器之間通過 IBGP 交換路由信息。如果沒有水平分割機制&#xff0c;當多個路由器之間形成…

Python視頻標簽工具詳解:基于wxPython和FFmpeg的實現

在當今數字媒體時代&#xff0c;視頻內容的管理和標記變得越來越重要。無論是研究人員需要對實驗視頻進行時間點標記&#xff0c;教育工作者需要對教學視頻添加注釋&#xff0c;還是個人用戶希望對家庭視頻進行分類整理&#xff0c;一個高效的視頻標簽工具都是不可或缺的。本文…

國產三維CAD「皇冠CAD」在汽車零部件領域建模教程:剎車片

本教程深度融合三維皇冠CAD&#xff08;CrownCAD&#xff09;的MBD&#xff08;Model-Based Definition&#xff09;設計理念&#xff0c;通過參數化建模、智能約束管理、動態裝配驗證等功能&#xff0c;實現數據驅動設計&#xff0c;精準解決了汽車制動系統中精密制動組件的設…

C#從入門到精通(3)

目錄 第九章 窗體 &#xff08;1&#xff09;From窗體 &#xff08;2&#xff09;MDI窗體 &#xff08;3&#xff09;繼承窗體 第十章 控件 &#xff08;1&#xff09;控件常用操作 &#xff08;2&#xff09;Label控件 &#xff08;3&#xff09;Button控件 &…

關于跨域與.NET的處理方案

在 Web 開發里&#xff0c;瀏覽器的同源策略是一項關鍵的安全機制。同源指的是兩個 URL 的協議、域名和端口都相同。當瀏覽器從一個源&#xff08;域名、協議、端口&#xff09;的網頁去請求另一個源的資源時&#xff0c;就會產生跨域問題。例如&#xff0c;從 http://www.exam…

react 15-16-17-18各版本的核心區別、底層原理及演進邏輯的深度解析--react18

React 18 是一次重大的版本升級&#xff08;發布于2022年&#xff09;&#xff0c;引入了并發渲染&#xff08;Concurrent Rendering&#xff09; 和一系列新特性&#xff0c;旨在提升應用性能、用戶體驗和開發靈活性。 一、核心新特性 并發模式&#xff08;Concurrent Mode&a…

基于Spring Boot的平面設計課程在線學習平臺系統的設計與實現(LW+源碼+講解)

專注于大學生項目實戰開發,講解,畢業答疑輔導&#xff0c;歡迎高校老師/同行前輩交流合作?。 技術范圍&#xff1a;SpringBoot、Vue、SSM、HLMT、小程序、Jsp、PHP、Nodejs、Python、爬蟲、數據可視化、安卓app、大數據、物聯網、機器學習等設計與開發。 主要內容&#xff1a;…

Scala-面向對象

Scala 包 基本語法 package 包名 Scala 包的三大作用&#xff08;和 Java 一樣&#xff09; 區分相同名字的類 當類很多時&#xff0c;可以很好的管理類 控制訪問范圍 包的命名、說明、對象 包的命名 命名規則 只能包含數字、字母、下劃線、小圓點.&#xff0c;但不能用數字…

Excel 使用技巧:excel 合并不同列內容; excel 將公式轉化為文本

Excel 使用技巧 目錄 Excel 使用技巧excel 合并不同列內容="A:"&C1&"、B:"&D1&"、C:"&E1&"、D:"&F1excel 將公式轉化為文本右鍵選擇行粘貼某一列均填入“提示詞”單擊拖動雙擊某一列均填入“1”清除1…

【數字化轉型,企業應用上云】---持續集成能力重塑企業軟件交付新范式

在數字化轉型浪潮中&#xff0c;軟件交付的速度與質量已成為企業核心競爭力的關鍵。如何高效管理從代碼開發到生產上線的全流程&#xff0c;實現開發與運維的無縫協作&#xff1f;如何通過自動化手段減少人為失誤、加速迭代周期&#xff1f;我們出的研發效能管理平臺&#xff0…

OpenCV圖像形態學:原理、操作與應用詳解

一、引言 圖像形態學&#xff08;Image Morphology&#xff09;是圖像處理領域的一個重要分支&#xff0c;它基于集合論、格論、拓撲學和隨機函數理論&#xff0c;主要用于分析和處理圖像的幾何結構。形態學操作通過特定的結構元素&#xff08;Structuring Element&#xff09;…