Android笔记:Android UI学习 - 对话框 (AlertDialog & ProgressDialog)

Android进度提示组件演进:从ProgressDialog到现代方案 在Android开发中,进度提示是提升用户体验的重要组件。传统ProgressDialog通过模态对话框实现进度展示,但存在UI阻塞和生命周期管理问题。现代方案如ProgressBar和DialogFragment采用非阻塞式设计,遵循Material Design规范,支持灵活定制和生命周期感知。结合SwipeRefreshLayout可实现下拉刷新,而顶部进度条则适合WebView等场景。对于耗时任务,推荐使用带取消按钮的对话框或前台服务通知。开发者需注意内存泄漏防护和配置变更处理,并遵循8dp栅格系统 阅读详情

本文是对网上的文章《Android开发指南-用户界面-对话框》的部分内容进行简化,并加上自己的某些理解。里面的相同内容,版权归原翻译作者所有。

显示对话框

    对话框经常作为Activity的一部分来创建和显示。你通常应该从protected Dialog Activity.onCreateDialog (int id) 回调方法里创建对话框。当你使用这个回调函数时,Android系统会有效的设置这个Activity为每个对话框的所有者,从而自动管理每个对话框的状态并挂靠到Activity上。这样,每个对话框继承这个Activity的特定属性。比如,当一个对话框打开时,菜单键显示为这个Activity定义的选项菜单,音量键修改Activity使用的音频流。

 
  1. 注意: 如果你决定在onCreateDialog()方法之外创建一个对话框,它将不会被附着到活动上。不过,你可以通过setOwnerActivity(Activity)把它附着到一个活动上。 

    当你想要显示一个对话框时,调用showDialog(int id) 方法并传递一个唯一标识这个对话框的整数。

    当对话框第一次被请求时,Android从你的Activity中调用onCreateDialog(int id),你应该在这里初始化这个对话框Dialog。这个回调方法被传以和showDialog(int id)相同的ID。当你创建这个对话框后,在Activity的最后返回这个对象。

    在对话框被显示之前,Android还调用了可选的回调函数onPrepareDialog(int id, Dialog). 如果你想在每一次对话框被打开时改变它的任何属性,你可以定义这个方法。这个方法在每次打开对话框时被调用,而onCreateDialog(int) 仅在对话框第一次打开时被调用。如果你不定义onPrepareDialog(),那么这个对话框将保持和上次打开时一样。这个方法也被传递以对话框的ID,和在onCreateDialog()中创建的对话框对象。(个人理解是,在本Activity里第一次show某个Dialog,则先调用onCreateDialog,得到返回的Dialog对象并挂靠在Activity,保存Dialog对象的引用,然后才显示Dialog。这样子,下次再show Dialog就不用重新创建Dialog对象,而是重用旧的)

    定义onCreateDialog(int) 和 onPrepareDialog(int, Dialog) 回调函数的最佳方法是使用一个switch 语句来检查传递进来的id 参数。每个case 应该检查一个唯一的对话框ID然后创建和定义相应的对话框。比如,想象一下一个游戏使用两个不同的对话框:一个用来指示这个游戏已经暂停而另一个来指示游戏结束。首先,为每个对话框定义一个常量:

 
  1. static final int DIALOG_PAUSED_ID = 0; 
  2. static final int DIALOG_GAMEOVER_ID = 1; 

然后,为每一个ID用一个switch case定义这个onCreateDialog(int) 回调函数:

 
  1. protected Dialog onCreateDialog(int id) { 
  2.     Dialog dialog; 
  3.     switch(id) { 
  4.     case DIALOG_PAUSED_ID: 
  5.         // do the work to define the pause Dialog 
  6.         break; 
  7.     case DIALOG_GAMEOVER_ID: 
  8.         // do the work to define the game over Dialog 
  9.         break; 
  10.     default: 
  11.         dialog = null; 
  12.     } 
  13.     return dialog; 
  14. } 

当是时候显示其中之一的对话框时,使用对话框ID调用showDialog(int):

 
  1. showDialog(DIALOG_PAUSED_ID); 
 
消除对话框Dismissing a Dialog

    当你准备关闭对话框时,你可以通过对这个对话框调用dismiss()来消除它。如果需要,你还可以从这个Activity中调用dismissDialog(int id) 方法,这实际上将为你对这个对话框调用dismiss() 方法。

    如果你想使用onCreateDialog(int id) 方法来管理你对话框的状态(就如同在前面的章节讨论的那样),然后每次你的对话框消除的时候,这个对话框对象的状态将由该Activity保留。如果你决定不再需要这个对象或者清除该状态是重要的,那么你应该调用removeDialog(int id)。这将删除任何内部对象引用而且如果这个对话框正在显示,它将被消除。

 
使用消除侦听器Using dismiss listeners

    如果你希望你的应用程序在一个对话框消亡的时候执行一些流程,那么你应该附着一个on-dismiss侦听器到对话框上。

 
  1. @Override 
  2. protected void onPrepareDialog(int id, Dialog dialog) { 
  3.     switch(id){ 
  4.     case PROGRESS_DIALOG: 
  5.         dialog.setOnDismissListener(new DialogInterface.OnDismissListener(){ 
  6.             @Override 
  7.             public void onDismiss(DialogInterface dialog) { 
  8.                 Toast.makeText(getApplicationContext(), 
  9.                         "dismiss listener!", 
  10.                         Toast.LENGTH_SHORT) 
  11.                 .show(); 
  12.             } 
  13.         }); 
  14.     } 
  15. } 

    然而, 请注意对话框也可以被“取消”。这是一个表明对话框被用户显示取消的特殊情况。这将在用户按“返回”按钮时发生,或者这个对话框显示的调用cancel() (也许通过对话框上的一个“取消”按钮)。当一个对话框被取消时,这个OnDismissListener 依然会被通知到,但是如果你希望在对话框被显示取消时被通知到(而不是通常的消除方式),那么你应该通过setOnCancelListener()注册一个DialogInterface.OnCancelListener 。

    目前个人学习发现,一般情况下,调用dialog.cancel()就会触发onCancelLister。而点击AlertDialog的NegativeButton (Cancel/No)是不会触发的。对于setOnCancelListener()要注意的是,这里有两个setOnCancelListener(),但返回值不同:

 
  1. //AlertDialog.Builder调用的 
  2. public AlertDialog.Builder setOnCancelListener (DialogInterface.OnCancelListener onCancelListener) 
  3.  
  4. //Dialog调用的 
  5. public void setOnCancelListener (DialogInterface.OnCancelListener listener) 
 
警告对话框AlertDialog的使用

    为了创建一个警告对话框,使用AlertDialog.Builder 子类。通过AlertDialog.Builder(Context)获取一个构造器然后使用这个类的公共方法来定义警告对话框的所有属性。当得到构造器后,通过create().方法来获取警告对话框对象。有时我是不调用create()的,而是在设置好了后直接调用show()显示AlertDialog。

Dialog_button Dialog_button Dialog_button

增加按钮Adding buttons

    这就是我一开始很想知道的究竟如何添加Yes/No,Ok/Cancel这样的按钮。原来是通过setPositiveButton(...)响应Yes/Ok的点击,setNeutralButton(...)响应中立行为的点击,setNegativeButton(...)响应No/Cancel的点击。注意,只能各自设置一个按钮来响应点击事件。

 
  1. AlertDialog.Builder builder = new AlertDialog.Builder(this); 
  2. builder.setMessage("Are you sure you want to exit?") 
  3.        .setCancelable(false) 
  4.        .setPositiveButton("Yes", new DialogInterface.OnClickListener() { 
  5.            public void onClick(DialogInterface dialog, int id) { 
  6.                 MyActivity.this.finish(); 
  7.            } 
  8.        }) 
  9.        .setNegativeButton("No", new DialogInterface.OnClickListener() { 
  10.            public void onClick(DialogInterface dialog, int id) { 
  11.                 dialog.cancel(); 
  12.            } 
  13.        }); 
  14. AlertDialog alert = builder.create(); 

    首先,为这个对话框添加一个消息setMessage(CharSequence)。然后,开始函数链并设置该对话框为不能取消not cancelable (因此用户不能使用返回按钮关闭这个对话框)。对每个按钮,使用任一set...Button() 方法,比如setPositiveButton(),该方法接受按钮名称以及一个定义用户选中按钮后所采取动作的DialogInterface.OnClickListener。

增加一个列表Adding a list
 
  1. final CharSequence[] items = {"Red", "Green", "Blue"}; 
  2.   
  3. AlertDialog.Builder builder = new AlertDialog.Builder(this); 
  4. builder.setTitle("Pick a color"); 
  5. builder.setItems(items, new DialogInterface.OnClickListener() { 
  6.     public void onClick(DialogInterface dialog, int item) { 
  7.         Toast.makeText(getApplicationContext(), items[item], Toast.LENGTH_SHORT).show(); 
  8.     } 
  9. }); 
  10. AlertDialog alert = builder.create(); 

    首先,用setTitle(CharSequence)方法给对话框添加一个标题。然后,添加用setItems()添加一个可选项列表,该列表接受一组显示的items和一个DialogInterface.OnClickListener 来定义用户选中按钮后所采取动作。

增加复选框和单选按钮

    要在对话框里创建一个多选项列表(checkboxes)或者单选项(radio buttons),可分别调用setMultiChoiceItems() 和setSingleChoiceItems() 方法。如果你在onCreateDialog()回调函数中创建这些可选列表,Android会帮你管理列表状态。只要这个活动是激活的,对话框会记住之前选中的items,但如果用户退出这个活动,用户选择将丢失。

    注意: 为了在用户离开或暂停这个活动的时候能够保存选择,你必须通过活动生命期Activity Lifecycle来恰当的保存和恢复设置。为了永久保存选项,即使活动进程被完全终止,你需要使用数据存储Data Storage技术。

 
  1. final CharSequence[] items = {"Red", "Green", "Blue"}; 
  2.   
  3. AlertDialog.Builder builder = new AlertDialog.Builder(this); 
  4. builder.setTitle("Pick a color"); 
  5. builder.setSingleChoiceItems(items, -1, new DialogInterface.OnClickListener() { 
  6.     public void onClick(DialogInterface dialog, int item) { 
  7.         Toast.makeText(getApplicationContext(), items[item], Toast.LENGTH_SHORT).show(); 
  8.     } 
  9. }); 
  10. AlertDialog alert = builder.create(); 

    setSingleChoiceItems() 的第二个参数是一个checkedItem整型数值,指示了基于0的缺省选择项的位置。“-1”代表不会有默认选择项。

 
进度对话框Progress Dialog的使用

    ProgressDialog是AlertDialog类的一个扩展,可以为一个未定义进度的任务显示一个旋转轮形状的进度动画,或者为一个指定进度的任务显示一个进度条。

    可以简单地通过调用ProgressDialog.show()方法来显示一个进度对话框,而通过onCreateDialog(int)回调管理这个对话框是可选的,如下所示:

 
  1. ProgressDialog.show(this, // context 
  2.     "", // title 
  3.     "Loading. Please wait...", // message 
  4.     true); //进度是否是不确定的,这只和创建进度条有关 

进度对话框的缺省类型是一个旋转轮,运行看到的是以下效果:

ProgressDialog

    由于ProgressDialog是AlertDialog的扩展类,所以ProgressDialog也能设置按钮,比如一个取消下载的按钮。不过要注意的是,和前面的AlertDialog.Builder不同,ProgressDialog是调用AlertDialog的setButton,setButton2,setButton3函数,这些函数没有明确哪个是正面/中立/负面的,由我们决定。

显示进度条Showing a progress bar

而选择动画进度条显示进度:

1.   用类构造器初始化进度对话框,ProgressDialog(Context)。

2.   用setProgressStyle(int)方法设置进度风格为"STYLE_HORIZONTAL"以及设置其它属性,比如消息。

创建ProgressDialog大概是这样的:

 
  1. ProgressDialog progressDialog = new ProgressDialog(getApplicationContext());  
  2.   
  3. progressDialog.setProgressStyle(ProgressDialog.STYLE_HORIZONTAL);  
  4. progressDialog.setIcon(R.drawable.alert_dialog_icon);  
  5. progressDialog.setMessage("Loading...");  
  6. progressDialog.setCancelable(false);  

3.   当你准备显示这个对话框时,调用show()或者从onCreateDialog(int)回调中返回ProgressDialog。

4.   你可以通过调用setProgress(int)设置当前进度百分比或者调用incrementProgressBy(int)方法增加进度值。

官方文档提供了如何在另一线程来跟踪进程进度,让进度值变化。对此可以参考http://androidappdocs.appspot.com/guide/topics/ui/dialogs.html里面的代码。也可以查看后面的文章《有关Android线程的学习》里面的例子,看看如何使用Handler, Message机制!

 
创建自定义对话框Creating a Custom Dialog

    创建自定义对话框,首先要创建一个Layout xml 文件,在此不啰嗦了。然后加载Layout有两种方法,也是非常熟悉的那两种方法:

    1. setContentView(int resources id)

    2. 利用LayoutInflater加载

   官方还提示我们,一般使用Dialog类来创建对话框,是需要setTitle的,不设置的话,标题占用的空间保持为空,但仍然可见。而不想要那个标题,那应该使用警告对话框AlertDialog来创建自定义对话框。然而,因为警告对话框可以很简单的通过AlertDialog.Builder 类来创建,你并不需要访问上面使用的setContentView(int) 方法。相反,你必须使用setView(View),则需要使用LayoutInflater来加载Layout得到View。

具体代码参考http://androidappdocs.appspot.com/guide/topics/ui/dialogs.html

 

【Android】一、进度提示方案:ProgressBar,ProgressDialog,AlertDialog 前言 更新版本,上传数据到服务端,都是需要进度显示的,Android进度显示两种方式 ProgressDialog 和 ProgressBar。 新版本中ProgressDialog不被推荐使用,所以项目采用ProgressBar。 另有替代方案,采用AlertDialog去提示用户上传和下载的结束,不提供进度界面   简单备注 Progress分为三种实现方式: 1、MainAct... 阅读详情

相关推荐

【android开发-09】android中AlertDialog和ProgressDialog的用法介绍

android中AlertDialog和ProgressDialog的参考代码用例

jiangchaobing_2017的博客 988

Android UI学习 - 对话框 (AlertDialog & ProgressDialog)

本文是对网上的文章《Android开发指南-用户界面-对话框》的部分内容进行简化,并加上自己的某些理解。里面的相同内容,版权归原翻译作者所有。 显示对话框 对话框经常作为Activity的一部分来创建和显示。你通常应该从protected DialogActivity.onCreateDialog (int id) 回调方法里创建对话框。当你使用这个回调函...

weixin_34032621的博客 231

构建个性化Android对话框大全

在Android开发中,对话框(Dialog)是一种覆盖在应用程序上的浮动窗口,用于临时显示信息、接收用户输入或操作。对话框是用户与应用程序交互的重要方式,提供了丰富的UI元素,如按钮、文本输入框、选择器等,用于展示简短的、紧急的信息或请求用户的即时反馈。对话框分为系统默认对话框和自定义对话框。系统默认对话框如AlertDialog、ProgressDialog、DatePickerDialog和TimePickerDialog等,它们提供了通用的界面和标准交互,易于快速实现常用功能。

weixin_32661831的博客 846

android alertdialog 进度条,android – 将循环进度条用作alertdialog或progressdialog

xmlns:custom="http://schemas.android.com/apk/res-auto"android:orientation="vertical"android:background="#000000"android:layout_width="match_parent"android:layout_height="match_parent"android:id = "@+i...

weixin_28785509的博客 404

LoadingAlertDialog

LoadingAlertDialog 普通loading metarial风格的loading 各种显示动画的QQ提示对话框

CarPlay无线连接开发实战:从蓝牙EIR查询到iAP2认证的完整代码逻辑梳理

本文详细解析了无线CarPlay连接开发的完整流程,从蓝牙EIR查询到iAP2认证的代码实现。重点介绍了蓝牙握手、WiFi Beacon帧配置、热点信息准备等关键环节的实战技巧,帮助开发者快速搭建稳定可靠的无线CarPlay连接系统。

weixin_31534091的博客 321

【LoadingDialog】标准款待加载对话框

上图是dialog的效果图,以下为代码: Java类: package com.jmheart.mechanicsbao.ui.util; import android.app.AlertDialog; import android.content.Context; import android.os.Bundle; import android.text.TextUtils; im...

欢迎进入JesseAndroid的博客 822

5.1 Tessent Atpg系列 第八章 Test Pattern Generation - Verify Test Pattern

为什么要做基于timing的仿真,意义在于可以比较ATPG工具和simulator工具的差异性。因为时序的差异导致不同的结果。首先你需要通过write_patern 这句cmd来写出pattern,默认是parallel 模式,除非你用-serial 指定写出serial, 因为serial 文件非常大,所以你可以使用-sample 开关写出部分pattern即可,工具会根据每一种pattern 类型都会至少保存一只。 另外,你也可以使用-start -end 开关来减少文件大小,但是这样的截取,是不可靠的

ciscomonkey的博客 7763

Android对话框(AlertDialog+ProgressDialog)

对话框是人机交互过程中十分常见的组件,一般用于在特定条件下对用户显示一些信息,可以增强应用的友好性。 Dialog 类是对话框的基类。对话框虽然可以在界面上显示,但是 Dialog 不是 View 类的子类,而是直接继承自 java.lang.Object 类。 Dialog 对象也有自己的生命周期,其生命周期由创建它的 Activity 进行管理。 Activity 可以调用 showDialo...

jijiangpeng的博客 746

ANSYS Discovery 2023R1 入门:手把手教你玩转几何模型参数化(附历史追踪避坑指南)

本文详细介绍了ANSYS Discovery 2023R1中几何模型参数化建模的全流程,包括基础设置、参数化实战技巧及历史追踪避坑指南。通过Workbench集成和智能参数控制,工程师可以高效完成设计迭代,特别适合需要频繁调整几何模型的仿真场景。文章还提供了参数丢失的预防策略和工业应用实例,帮助用户快速掌握这一提升设计效率的核心技能。

weixin_33693070的博客 462

搞定汽车座椅电机EMC超标:一个PCB滤波板的实战设计与避坑心得

本文详细介绍了汽车座椅电机EMC超标问题的解决方案,通过PCB滤波板的实战设计,解决了传导发射测试超标问题。文章分享了在空间受限条件下的滤波电路架构设计、接地系统优化及迭代验证过程,为汽车直流电机的EMC整改提供了实用方法论。

weixin_30336061的博客 380

Android UI 之 ProgressBar、ProgressDialog、AlertDialog

参考: http://www.cnblogs.com/plokmju/p/android_ProgressBar.html http://www.oschina.net/question/157182_37992 《第一行代码》P100 研究不用写法Style之间的异同 xml已有部分: <TextView android:layout_width="mat

岁月如歌 3643

Unity镜子效果的实现(无需镜子Shader)

Unity镜子效果制作教程 本文提供全流程,中文翻译。 Chinar 坚持将简单的生活方式,带给世人!(拥有更好的阅读体验 —— 高分辨率用户请根据需求调整网页缩放比例) Chinar —— 心分享、心创新!助力快速实现一个简单的镜面反射效果为新手节省宝贵的时间,避免采坑! Chinar 教程效果: 1 Cre...

weixin_33947521的博客 9564

ProgressDialog(带进度条的对话框)的基本使用

ProgressDialog和AlertDialog有点类似,都可以在界面上弹出一个对话框,都能够屏蔽掉其他控件的交互能力。不同的是,ProgressDialog会在对话框中显示一个进度条,一般用于表示当前操作比较耗时,让用户耐心地等待。他的用法和AlertDialog也比较相似。 效果图:   activity_main.xml代码: &amp;lt;?xml version=&quot;1.0...

Android_小牧的博客 4988

Pulseaudio之同步/异步(十一)

PulseAudio是一个声音服务器,一个后台进程从一个或多个音源(进程或输入设备)接受声音输入 然后重定向声音到一个或多个槽(声卡,远程网络PulseAudio服务,或其他进程)。 PulseAudio的主要特点包括: 可对每一个应用程序进行音量控制Per-application volume controls 可扩展的插件与支持可装载模块架构 兼容性许多流行的音频应用程序 支持多重音源和多重输出 低延时操作和支持延迟测量 一个对处理器资源效率零拷贝内存架构 能够发现本地网络上使用PulseAu

Android系统攻城狮 1000

【WorkBuddy专栏19】技能的创造与迁移——从零开始打造你的AI工作流

【WorkBuddy专栏19】技能的创造与迁移——从零开始打造你的AI工作流

AI人人懂 373

安卓开发【UI组件】-对话框1

安卓提供了丰富的对话框支持,它提供了如下4种常用的对话框。 AlertDialog:功能最丰富、实际应用最广泛的对话框。 ProgressDialog:进度对话框,这个对话框只是对进度条的包装。 DataPickerDialog:日期选择对话框,这个对话框只是对DataPicker的包装。 TimePickerDialog:时间选择对话框,这个对话框只是对TimePicker的包装。 其中...

一只洒鹿 958

WINCC7.3破解文件

WINCC7.3硬件够破解文件,有需要的下载!WINCC7.3硬件够破解文件,有需要的下载!

Day18-基于Android的AlertDialog、ProgressDialog、DatePickerDialog实例

文章目录题目效果图一、开发主页面MainActivity1.编写主页布局activity_main.xml2.编写主页MainActivity.java二、开发AlertDialog页面1.编写activity_alert_dialog.xml2.编写AlertDialog.java三、开发DatePickerDialog页面1.编写activity_date_picker_dialog.xml2. 编写DatePickerDialog.java 题目 请创建一个模块,设计多个页面,分别用到AlertDia

Youmonster的博客 4052

霍尼韦尔SoftMaster使用说明

霍尼韦尔SoftMaster使用说明

win10 跳过U8环境检测的IE WebControls.rar

win10 安装u8的时候 提示IE WebControls 不通过,这个工具可以欺骗u8的检查。 跳过U8环境检测的IE WebControls。提示导入失败后,重新检测通过。

对话框 (AlertDialog & ProgressDialog)

本文是对网上的文章《Android开发指南-用户界面-对话框》的部分内容进行简化,并加上自己的某些理解。里面的相同内容,版权归原翻译作者所有。 显示对话框     对话框经常作为Activity的一部分来创建和显示。你通常应该从protected Dialog Activity.onCreateDialog (int id) 回调方法里创建对话框。当你使用这个回调函数时,Android

珍惜一切の就算没有拥有 576

IEM模型,地表粗糙度模拟

利用微波反演土壤水分时候,利用IEM模型可以实现对随机地表的模拟

Android Dialog、AlertDialog、ProgressDialog、SweetAlertDialog、CustomDialog、DialogFragment

普通Dialog private void myAlertDialog() { new AlertDialog .Builder(activity) .setMessage("关闭当前页面..") .setPositiveButton("OK", new DialogInterf...

张雨的博客 335

c语言监听安卓应用上层的弹框,Android对话框(AlertDialog+ProgressDialog)

对话框是人机交互过程中十分常见的组件,一般用于在特定条件下对用户显示一些信息,可以增强应用的友好性。Dialog 类是对话框的基类。对话框虽然可以在界面上显示,但是 Dialog 不是 View 类的子类,而是直接继承自 java.lang.Object 类。Dialog 对象也有自己的生命周期,其生命周期由创建它的 Activity 进行管理。Activity 可以调用 showDialog(i...

weixin_35959366的博客 425

Android用户界面-对话框总结

    Android系统提供了四种对话框:警告对话框(AlertDialog),进度对话框(ProgressDialog),日期选择对话框(DatePickerDialog),时间选择对话框(TimePickerDialog)。   1>.AlertDialog:一个用于提示用户做出选择的窗口。          创建AlertDialog步骤如下:                 (1).获得AlertDialog的静态内部类Builder对象,由该类来创建对话框。                 (2

wo_yao_daydayup 750
上一篇: Android笔记:Android adb shell 命令
下一篇: Android笔记:Button居中|水平居中|垂直居中(总结)
Mars2639
博客等级 码龄16年 227粉丝 18原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值