Android Dialog

article/2025/9/21 15:39:02

Android Dialog

创建对话框

一个对话框一般是一个出现在当前Activity之上的一个小窗口. 处于下面的Activity失去焦点, 对话框接受所有的用户交互. 对话框一般用于提示信息和与当前应用程序直接相关的小功能.

Android API 支持下列类型的对话框对象:

  • 警告对话框 AlertDialog:  一个可以有0到3个按钮, 一个单选框或复选框的列表的对话框. 警告对话框可以创建大多数的交互界面, 是推荐的类型.
  • 进度对话框 ProgressDialog:  显示一个进度环或者一个进度条. 由于它是AlertDialog的扩展, 所以它也支持按钮.
  • 日期选择对话框 DatePickerDialog:  让用户选择一个日期.
  • 时间选择对话框 TimePickerDialog:  让用户选择一个时间.

如果你希望自定义你的对话框, 可以扩展Dialog类.

Showing a Dialog 显示对话框

一个对话框总是被创建和显示为一个Activity的一部分. 你应该在Activity的onCreateDialog(int)中创建对话框. 当你使用这个回调函数时,Android系统自动管理每个对话框的状态并将它们和Activity连接, 将Activity变为对话框的"所有者". 这样,每个对话框从Activity继承一些属性. 例如,当一个对话框打开时, MENU键会显示Activity的菜单, 音量键会调整Activity当前使用的音频流的音量.

 

注意: 如果你希望在onCreateDialog()方法之外创建对话框, 它将不会依附在Activity上. 你可以使用setOwnerActivity(Activity)来将它依附在Activity上.

当你希望显示一个对话框时, 调用showDialog(int)并将对话框的id传给它.

当一个对话框第一次被请求时,Android调用onCreateDialog(int). 这里是你初始化对话框的地方. 这个回调函数传入的id和showDialog(int)相同. 创建对话框之后,将返回被创建的对象.

在对话框被显示之前,Android还会调用onPrepareDialog(int, Dialog). 如果你希望每次显示对话框时有动态更改的内容, 那么就改写这个函数. 该函数在每次一个对话框打开时都调用. 如果你不定义该函数,则对话框每次打开都是一样的. 该函数也会传入对话框的id以及你在onCreateDialog()中创建的Dialog对象.

最好的定义onCreateDialog(int) 和onPrepareDialog(int, Dialog) 的方法就是使用一个switch语句来检查传入的id. 每个case创建相应的对话框. 例如, 一个游戏使用两个对话框: 一个来指示游戏暂停,另一个指示游戏结束. 首先, 为它们定义ID:

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

然后, 在onCreateDialog(int)中加入一个switch语句:

protected Dialog onCreateDialog(int id) {
    
Dialog dialog;
    
switch(id) {
    
case DIALOG_PAUSED_ID:
        
// do the work to define the pause Dialog
        
break;
    
case DIALOG_GAMEOVER_ID:
        
// do the work to define the game over Dialog
        
break;
    
default:
        dialog 
= null;
    
}
    
return dialog;
}

 

注意: 在这个例子中, case语句为空因为定义Dialog的程序在后面会有介绍.

在需要显示对话框是, 调用showDialog(int), 传入对话框的id:

showDialog(DIALOG_PAUSED_ID); Dismissing a Dialog 解除对话框

当你准备关闭对话框时, 你可以使用dismiss()函数. 如果需要的话, 你也可以从Activity调用dismissDialog(int), 二者效果是一样的.

如果你使用onCreateDialog(int)来管理你的对话框的状态, 那么每次你的对话框被解除时, 该对话框对象的状态会被Activity保存. 如果你决定你不再需要这个对象或者需要清除对话框的状态, 那么你应该调用 removeDialog(int). 这将把所有该对象的内部引用移除, 如果该对话框在显示的话将被解除.

Using dismiss listeners 使用解除监听器

如果你希望在对话框解除时运行某些程序, 那么你应该给对话框附加一个解除监听器.

首先定义DialogInterface.OnDismissListener接口. 这个接口只有一个方法, onDismiss(DialogInterface), 该方法将在对话框解除时被调用.

然后将你的OnDismissListener实现传给setOnDismissListener().

然而,注意对话框也可以被"取消". 这是一个特殊的情形, 它意味着对话框被用户显式的取消掉. 这将在用户按下"back"键时, 或者对话框显式的调用cancel()(按下对话框的cancel按钮)时发生. 当一个对话框被取消时, OnDismissListener将仍然被通知, 但如果你希望在对话框被显示取消(而不是正常解除)时被通知, 则你应该使用setOnCancelListener()注册一个DialogInterface.OnCancelListener.

Creating an AlertDialog 创建警告对话框

An AlertDialog is an extension of the Dialog class. It is capable of constructing most dialog user interfaces and is the suggested dialog type. You should use it for dialogs that use any of the following features:

一个警告对话框是对话框的一个扩展. 它能够创建大多数对话框用户界面并且是推荐的对话框类新星. 对于需要下列任何特性的对话框,你都应该使用它:

  • 一个标题
  • 一条文字消息
  • 1个-3个按钮
  • 一个可选择的列表(单选框或者复选框)

要创建一个AlertDialog, 使用AlertDialog.Builder子类. 使用AlertDialog.Builder(Context)来得到一个Builder, 然后使用该类的公有方法来定义AlertDialog的属性. 设定好以后, 使用create()方法来获得AlertDialog对象.

下面的主题展示了如何为AlertDialog定义不同的属性, 使用AlertDialog.Builder类. 如果你使用这些示例代码, 你可以在onCreateDialog()中返回最后的Dialog对象来获得图片中对话框的效果.


Adding buttons 增加按钮

要创建一个如图所示的窗口, 使用set...Button()方法:

AlertDialog.Builder builder = new AlertDialog.Builder(this);
builder.setMessage("Are you sure you want to exit?")
       .setCancelable(false)
       .setPositiveButton("Yes", new DialogInterface.OnClickListener() {
           public void onClick(DialogInterface dialog, int id) {
                MyActivity.this.finish();
           }
       })
       .setNegativeButton("No", new DialogInterface.OnClickListener() {
           public void onClick(DialogInterface dialog, int id) {
                dialog.cancel();
           }
       });
AlertDialog alert = builder.create();

首先,使用setMessage(CharSequence)为对话框增加一条消息。 然后, 开始连续调用方法, 使用setCancelable(boolean)将对话框设为不可取消(不能使用back键来取消)。对每一个按钮,使用set...Button()方法,该方法接受按钮名称和一个DialogInterface.OnClickListener,该监听器定义了当用户选择该按钮时应做的动作。

 

注意:对每种按钮类型,只能为AlertDialog创建一个。也就是说,一个AlertDialog不能有两个以上的"positive"按钮。这使得可能的按钮数量最多为三个:肯定、否定、中性。这些名字和实际功能没有联系,但是将帮助你记忆它们各做什么事情。

Adding a list 增加列表

要创建一个具有可选项的AlertDialog,使用setItems()方法:

final CharSequence[] items = {"Red", "Green", "Blue"};

AlertDialog.Builder builder = new AlertDialog.Builder(this);
builder.setTitle("Pick a color");
builder.setItems(items, new DialogInterface.OnClickListener() {
    public void onClick(DialogInterface dialog, int item) {
        Toast.makeText(getApplicationContext(), items[item], Toast.LENGTH_SHORT).show();
    }
});
AlertDialog alert = builder.create();

首先增加一个标题。然后使用setItems()增加一个可选列表,该列表接受一个选项名称的列表和一个DialogInterface.OnClickListener, 后者定义了选项对应的响应。

Adding checkboxes and radio buttons 增加单选框和复选框

要创建一个带有多选列表或者单选列表的对话框, 使用setMultiChoiceItems()和setSingleChoiceItems()方法。如果你在onCreateDialog()中创建可选择列表, Android会自动管理列表的状态. 只要activity仍然活跃, 那么对话框就会记住刚才选中的选项,但当用户退出activity时,该选择丢失。

 

注意: 要在你的acitivity离开和暂停时保存选择, 你必须在activity的声明周期中正确的保存和恢复设置。为了永久性保存选择,你必须使用数据存储技术中的一种。

要创建一个具有单选列表的AlertDialog,只需将一个例子中的setItems()换成 setSingleChoiceItems():

final CharSequence[] items = {"Red", "Green", "Blue"};

AlertDialog.Builder builder = new AlertDialog.Builder(this);
builder.setTitle("Pick a color");
builder.setSingleChoiceItems(items, -1, new DialogInterface.OnClickListener() {
    public void onClick(DialogInterface dialog, int item) {
        Toast.makeText(getApplicationContext(), items[item], Toast.LENGTH_SHORT).show();
    }
});
AlertDialog alert = builder.create();

第二个参数是默认被选中的选项位置,使用“-1”来表示默认情况下不选中任何选项。

Creating a ProgressDialog 创建进度对话框

一个ProgressDialog(进度对话框)是AlertDialog的扩展。它可以显示一个进度的动画——进度环或者进度条。这个对话框也可以提供按钮,例如取消一个下载等。

打开一个进度对话框很简单,只需要调用 ProgressDialog.show()即可。例如,上图的对话框可以不通过onCreateDialog(int),而直接显示:

ProgressDialog dialog = ProgressDialog.show(MyActivity.this, "",
                        
"Loading. Please wait...", true);

第一个参数是应用程序上下文。第二个为对话框的标题(这里为空),第三个为对话框内容, 最后一个为该进度是否为不可确定的(这只跟进度条的创建有关,见下一节)。

进度对话框的默认样式为一个旋转的环。如果你希望显示进度值,请看下一节。

Showing a progress bar 显示进度条

使用一个动画进度条来显示进度:

  1. 使用 ProgressDialog(Context)构造函数来初始化一个ProgressDialog对象。
  2. 将进度样式设置为"STYLE_HORIZONTAL",使用setProgressStyle(int)方法。并且设置其它属性,例如内容等。
  3. 在需要显示时调用show()或者从onCreateDialog(int)回调函数中返回该ProgressDialog。
  4. 你可以使用 setProgress(int)或者incrementProgressBy(int)来增加显示的进度。

例如,你的设置可能像这样:

ProgressDialog progressDialog;
progressDialog = new ProgressDialog(mContext);
progressDialog.setProgressStyle(ProgressDialog.STYLE_HORIZONTAL);
progressDialog.setMessage("Loading...");
progressDialog.setCancelable(false);

设置很简单。大部分创建进度对话框需要的代码是在更新它的进程中。你可能需要在一个新的线程中更新它,并使用Handler来将进度报告给Activity。如果你不熟悉使用Handler和另外的线程,请看下列例子,该例子使用了一个新的线程来更新进度。

Example ProgressDialog with a second thread 例--使用一个线程来显示进度对话框

这个例子使用一个线程来跟踪一个进程的进度(其实为从1数到100)。每当进度更新时,该线程通过Handler给主activity发送一个消息。主Activity更新ProgressDialog.

package com.example.progressdialog;

import android.app.Activity;
import android.app.Dialog;
import android.app.ProgressDialog;
import android.os.Bundle;
import android.os.Handler;
import android.os.Message;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.Button;

public class NotificationTest extends Activity {
    
static final int PROGRESS_DIALOG = 0;
    
Button button;
    
ProgressThread progressThread;
    
ProgressDialog progressDialog;
   
    
/** Called when the activity is first created. */
    
public void onCreate(Bundle savedInstanceState) {
        
super.onCreate(savedInstanceState);
        setContentView
(R.layout.main);

        
// Setup the button that starts the progress dialog
        button 
= (Button) findViewById(R.id.progressDialog);
        button
.setOnClickListener(new OnClickListener(){
            
public void onClick(View v) {
                showDialog
(PROGRESS_DIALOG);
            
}
        
});
    
}
   
    
protected Dialog onCreateDialog(int id) {
        
switch(id) {
        
case PROGRESS_DIALOG:
            progressDialog 
= new ProgressDialog(NotificationTest.this);
            progressDialog
.setProgressStyle(ProgressDialog.STYLE_HORIZONTAL);
            progressDialog
.setMessage("Loading...");
            progressThread 
= new ProgressThread(handler);
            progressThread
.start();
            
return progressDialog;
        
default:
            
return null;
        
}
    
}

    
// Define the Handler that receives messages from the thread and update the progress
    
final Handler handler = new Handler() {
        
public void handleMessage(Message msg) {
            
int total = msg.getData().getInt("total");
            progressDialog
.setProgress(total);
            
if (total >= 100){
                dismissDialog
(PROGRESS_DIALOG);
                progressThread
.setState(ProgressThread.STATE_DONE);
            
}
        
}
    
};

    
/** Nested class that performs progress calculations (counting) */
    
private class ProgressThread extends Thread {
        
Handler mHandler;
        
final static int STATE_DONE = 0;
        
final static int STATE_RUNNING = 1;
        
int mState;
        
int total;
       
        
ProgressThread(Handler h) {
            mHandler 
= h;
        
}
       
        
public void run() {
            mState 
= STATE_RUNNING;   
            total 
= 0;
            
while (mState == STATE_RUNNING) {
                
try {
                    
Thread.sleep(100);
                
} catch (InterruptedException e) {
                    
Log.e("ERROR", "Thread Interrupted");
                
}
                
Message msg = mHandler.obtainMessage();
                
Bundle b = new Bundle();
                b
.putInt("total", total);
                msg
.setData(b);
                mHandler
.sendMessage(msg);
                total
++;
            
}
        
}
        
        
/* sets the current state for the thread,
         * used to stop the thread */

        
public void setState(int state) {
            mState 
= state;
        
}
    
}
}
Creating a Custom Dialog 创建自定义对话框

如果你想自定义一个对话框,你可以使用布局元素来创造你的对话框的布局。定义好布局后,将根View对象或者布局资源ID传给setContentView(View).

例如,创建如图所示的对话框:

  1. 创建一个xml布局custom_dialog.xml:<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
                  
    android:id="@+id/layout_root"
                  
    android:orientation="horizontal"
                  
    android:layout_width="fill_parent"
                  
    android:layout_height="fill_parent"
                  
    android:padding="10dp"
                  
    >
        
    <ImageView android:id="@+id/image"
                   
    android:layout_width="wrap_content"
                   
    android:layout_height="fill_parent"
                   
    android:layout_marginRight="10dp"
                   
    />
        
    <TextView android:id="@+id/text"
                  
    android:layout_width="wrap_content"
                  
    android:layout_height="fill_parent"
                  
    android:textColor="#FFF"
                  
    />
    </LinearLayout>

    该xml定义了一个LinearLayout中的一个ImageView 和一个TextView。

  2. 将以上布局设为对话框的content view,并且定义ImageView 和 TextView的内容:
    Context mContext = getApplicationContext();
    Dialog dialog = new Dialog(mContext);

    dialog
    .setContentView(R.layout.custom_dialog);
    dialog
    .setTitle("Custom Dialog");

    TextView text = (TextView) dialog.findViewById(R.id.text);
    text
    .setText("Hello, this is a custom dialog!");
    ImageView image = (ImageView) dialog.findViewById(R.id.image);
    image
    .setImageResource(R.drawable.android);

    在初始化Dialog之后,使用setContentView(int),将布局资源id传给它。现在Dialog有一个定义好的布局,你可以使用findViewById(int)来找到该元素的id并修改它的内容。

  3. 使用前面所讲的方法显示对话框。

一个使用Dialog类建立的对话框必须有一个标题。如果你不调用setTitle(),那么标题区域会保留空白。如果你不希望有一个标题,那么你应该使用AlertDialog类来创建自定义对话框。然而,由于一个AlertDialog使用AlertDialog.Builder类来建立最方便,所以你没有方法使用setContentView(int),而是只能使用setView(View)。该方法接受一个View对象,所以你需要从xml中展开你的根View。

要展开一个xml布局,使用 getLayoutInflater() (或 getSystemService())取得LayoutInflater,然后调用inflate(int, ViewGroup),第一个参数为布局id,而第二个参数为根view的id。现在,你可以使用展开后的布局来找到View对象并定义ImageView和TextView元素的内容。然后实例化AlertDialog.Builder并使用setView(View)来为对话框设置展开后的布局。

例如:

AlertDialog.Builder builder;
AlertDialog alertDialog;

Context mContext = getApplicationContext();
LayoutInflater inflater = (LayoutInflater) mContext.getSystemService(LAYOUT_INFLATER_SERVICE);
View layout = inflater.inflate(R.layout.custom_dialog,
                               (ViewGroup) findViewById(R.id.layout_root));

TextView text = (TextView) layout.findViewById(R.id.text);
text.setText("Hello, this is a custom dialog!");
ImageView image = (ImageView) layout.findViewById(R.id.image);
image.setImageResource(R.drawable.android);

builder = new AlertDialog.Builder(mContext);
builder.setView(layout);
alertDialog = builder.create();

使用AlertDialog来自定义对话框,可以利用其内置特性例如按钮、选择列表、标题、图标等。


http://chatgpt.dhexx.cn/article/rnus3Mdq.shtml

相关文章

Dialogs(对话框)

对话框 对话框是一种提示用户去做出选择或输入其他信息的小窗口。 对话框不填充屏幕并且通常被用于在执行前需要用户做出决定的模态事件。 对话框设计 阅读 Dialogs 设计指南&#xff0c;获取包括语言规范等关于如何设计对话框的更多信息。 虽然 Dialog 类是对话框的基类&#…

【Android Dialog】Dialog

AlertDialog Dialog类是所有弹窗的父类&#xff0c;官方建议我们不要直接实例化它&#xff0c;而是使用其子类来获取实例。AlertDialog是系统提供的一个直接子类&#xff0c;它能帮助我们快速构建出不同类型的弹窗。接下来就看下各种类型弹窗的使用。 1、普通对话框 /*** Al…

DIALOG

[SAP]屏幕Dynpro 原文链接&#xff1a;http://www.cnblogs.com/jiangzhengjun/p/4292250.html 对话屏幕Dynpro(SE51). 11 屏幕元素... 11 屏幕属性... 11 PAI事件的触发、屏幕元素Function Code设置... 12 屏幕流逻辑Screen Flow Logic. 12 对话屏幕中的字段命名大小写问题...…

HTML基础之表单提交

表单提交 在网页上&#xff0c;一般都会有让你输入信息进行校验或者检索的地方&#xff0c;比如搜索栏或者输入账号密码进行登录的地方&#xff0c;当我们输入数据之后&#xff0c;单击确定或者搜索等按键的时候&#xff0c;网页就会把我们输入到输入框中的信息发送到与前端网…

JavaScript之Ajax-axios表单提交

目录 一.表单概念 二.表单提交 三.FormData语法 四.头像上传模板 五.请求体类型 六.图书管理(增删改查) 七.axios语法优化写法 优化1: axios全局配置 优化2: 默认的method 优化3: axios的快捷方法 一.表单概念 form标签&#xff08;表单&#xff09;是用来收集用户…

表单提交后跳转指定链接

表单的作用可以根据场景的变化而变化&#xff0c;可以是问卷调查、故障报修、自助下单等多种业务场景。如需提交后进行下一步操作&#xff0c;如成功提交咨询申请后自动跳转到咨询详情页&#xff0c;可以通过设置提交扩展&#xff0c;实现表单提交后跳转指定链接。 当跳转开启…

jquery form表单提交

使用jquery 进行form表单提交 文章目录 使用jquery 进行form表单提交先上结果&#xff1a;代码html代码 ---index.htmljs代码---index.js代码用到的jquery.js、select2的css和js在我项目里面有 下载地址 我这里使用了多选框&#xff08;传输到后端时&#xff0c;用对象接收&…

表单提交和超链接请求传递参数的几种方式

表单提交和超链接请求传递参数的几种方式 这段时间在使用easy-ui的datagrid&#xff0c;他有自己提交表单的方式&#xff0c;所以就整理整理页面对参数的提交方式&#xff1a; 注&#xff1a;下面代码都已经过测试。 1. HTML提交表单 HTML提交表单简单易操作&#xff0c;依靠…

模拟html post表单提交

一、打开自动提交访问 设置好表单账号密码&#xff0c;然后访问指定地址。就能自动提交登录并跳转到首页 1、填写访问表单信息 设置好表单账号密码 <input name"account" <input id"password" name"password" 然后填上访问地址action …

02 Ajax表单提交

目录 一、表单概念 1.表单 2.提交的两种方式 二、form-serize与FormData 1.form-serize 2.FormData 三、文件上传案例分析 以下的既为本文的核心概括 一、表单概念 1.表单 form标签&#xff08;表单&#xff09;是用来收集用户输入的信息。 表单构成&#xff1a; 表单标签&a…

Form表单提交

Form表单提交 form表单提交&#xff0c;表单提交分两种&#xff1a;自动提交 和 手动提交&#xff0c; form表单提交又分&#xff1a;post提交和get提交&#xff0c;以下用的都是post提交 一.自动提交表单&#xff1a; 自动提交表单&#xff0c;我们可以通过框架引用&#…

html 提交form表单提交数据格式,form表单提交数据

form表单提交的几种方法 HTML表单提交的几种方式方式一:通过submit按钮提交方式二:通过一般按钮button提交1/3javascript">functionsubmit1(){varform1=document.getElementById("form1");form1.action="bjpowernode.html";form1.submit();方式三…

JavaScript表单提交

表单提交在前端编程阶段中也是一个重点。它是由页面数据保存到后台数据库的重要枢纽&#xff0c;通过表单提交的方式将数据上传到数据库进行保存。同时这些数据也包含用户信息、统计信息、日志信息等等。 数据的信息不同&#xff0c;上传的方式也不同。在JavaScript中有四种种表…

表单提交的四种方式

表单提交的四种方式开发工具与关键技术&#xff1a;VS &#xff0c;JavaScript &#xff0c;Ajax 作者&#xff1a;刘任锋 撰写时间&#xff1a;2021年5月7日内容&#xff1a;将from表单里的内容提交到控制器上。 HTML布局 JS&#xff1a;先获取姓名&#xff0c;性别&#xff0…

表单的提交方式

表单有两个较特殊的属性&#xff0c;一个是method&#xff0c;是规定用于发送表单的HTTP方法&#xff08;提交表单的方式&#xff09;&#xff1b;还有一个是action&#xff0c;是规定当提交时向何处发送表单的数据&#xff08;要提交表单的地址&#xff09;。Form表单有一个自…

InputStream的read()读取机制

public void readArr() {// 明确文件File file new File("D:/net.txt");// 构建流的对象InputStream inputStream null;try {inputStream new FileInputStream(file);// 声名缓冲数组int i;byte[] bytes new byte[5];while ((i inputStream.read(bytes)) ! -1) …

java中的InputStream,OutputStream,Read,Writer

Java 中定义了两种类型的流&#xff1a;字节型&#xff0c;和字符型。 字节流&#xff1a;处理字节的输入和输出。包括读写二进制数据等方面的内容。 字符流&#xff1a;处理字符的输入和输出。他采用的是 Unicode 编码&#xff0c;可以实现国际化。使用字符流的另外一个好处…

InputStreamReader和OutputStreamWriter 的区别和用法

一、InputStreamReader 用于将一个字节流中的字节解码成字符 &#xff0c; 用法如下 Testpublic void Test19() throws Exception {InputStream in new FileInputStream("C:/hello.txt");// 读取文件的数据,注意文件编码为UTF-8,防止读取乱码// 将输入的字节流 ---…

InputStream.read() 和 OutputStream.write()方法

InputStream.read() 和 OutputStream.write()方法组合使用可以完成文件的复制功能。 先贴出代码 InputStream inputStream new FileInputStream(file);OutputStream os response.getOutputStream();byte[] b new byte[2048];int size;while ((size inputStream.read(b)) &…

InputStream 、 InputStreamReader和BufferedReader

在Java中&#xff0c;上述三个类经常用于处理数据流&#xff0c;下面介绍一下三个类的不同之处以及各自的用法。 InputStream &#xff1a; 是所有字节输入流的超类&#xff0c;一般使用它的子类&#xff1a;FileInputStream等&#xff0c;它能输出字节流&#xff1b;InputStre…