【Android开发API】用户界面-对话框 - Dialogs

合集下载
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

* 在文档中* 显示对话框 销毁对话框 创建弹出对话框 * 添加按钮 * 添加列表 创建进度对话框 显示进度条 创建自定义对话框 * 类* Dialog AlertDialog DialogFragment * 相关教程* Hello DatePicker Hello TimePicker 参考 Android 设计: 对话框
原文链接:/guide/topics/ui/dialogs.html
翻译:smalljing007 | smalljing007(徐寒静)
更新:2012.06.07
用户接⼝
Dialogs(对话框)通常是出现在当前Activity 前面的⼀个⼩窗体,在失去焦点时接受指令与用户进行交互。

对话框通常用于在程序短暂中断时通知提示用户,从而直接影响到正在运行的程序。

(例如:进度条或登录提示)Dialog 类是创建对话框的基类。

但是,您通常不应该直接实例化⼀个对话框。

相反,你应该使用下面的⼦类中的⼀个:AlertDialog (弹出对话框)*
它是可以操作0个,1个,2个按钮⼜或者是复选框,单选按钮列表的对话框。

该对话框是可以创建用户界面和建议的对话框类型。

详细参见如何创建AlertDialog (弹出对话框)。

ProgressDialog (进度条对话框)*
⼀种可以显示显示进度轮或进度条的对话框。

因为它是⼀种扩展的AlertDialog (弹出对话框),所以它也支持按钮。

详细参见创建ProgressDialog (进度条对话框)。

DatePickerDialog (日期选择对话框)*
⼀种允许用户选择⼀个日期的对话框。

详细参见“你好日期选择对话框”教程。

TimePickerDialog (时间选择对话框)*
⼀种允许用户选择⼀个时间的对话框。

详细参见“你好时间选择对话框”教程。

如果你想定制自⼰的对话框,定义⼀个新的布局,并且要继承Dialog 对象或上面列出的任何⼀个⼦类。

详细参见下面创建⼀个自定义对话框的部分。

对话框设计 阅读Android 对话框指南的设计准则
Dialog 是作为Activity 的⼀部分显示.常规的创建⼀个Dialog 需要用Activity 的 onCreateDialog(int)方法.调用
后,Android 系统会自动记录每⼀个对话框的状态,并且加载对话框方法。

有效的区分每个对话框的“所有者”。

所以每个对话框都会继承某些“所有者”的事件。

例如:打开对话框时菜单键显示为活动选项菜单,音量键修改音频流所使用的活动。

* 注意:* 当你使用onCreateDialog(int)方法创建⼀个对话框时,它不会直接指向Activity ,你需要使用setOwnerActivity (Activity )方法来使它成为指向Activity 的对话框。

当你想要显示⼀个对话框的时候,调用showDialog(int)方法,并传给它⼀个唯⼀的你想显示的对话框的身份识别在你的Activity 中,你实例化对话框,Android 会先调用onCreateDialog(int)方法,第⼀时间创建对话框。

这个回调
方法通过同⼀个你Show(int)在创建对话框后,返回对象的方法。

在对话框方法显示之前Android会先调用 onPrepareDialog(int, Dialog) 方法,如果你想每次对话框打开的时候改变对话框的⼀些属性的话,可以在改方法里面写⼀些代码. onCreateDialog(int)方法指在第⼀次打开的时候被调用⼀次.如果你没定义 onPrepareDialog() 方法,那么dialog会和原先打开的⼀样.
最好的方式来定义的onCreateDialog(int)和onPrepareDialog(int,Dialog),回调方法是用⼀个switch语句来检查传递到方法的id参数。

每⼀种情况下应该检查⼀个独特的对话ID,然后创建并定义相应的对话框。

例如,想象⼀个游戏使用两种不同的对话:⼀是表明游戏已暂停,另⼀个表明,游戏结束。

首先,为每个对话框定义⼀个整数ID:
static final int DIALOG_PAUSED_ID = 0;
static final int DIALOG_GAMEOVER_ID = 1;
然后,为每个ID用onCreateDialog(int)的方法定义返回:
protected Dialog onCreateDialog(int id) { Dialog dialog; switch(id) { case DIALOG_PAUSED_ID: // 定义暂停执行对话框 break; case DIALOG_GAMEOVER_ID: // 定义结束对话框 break; default: dialog = null; } return dialog; }
* 注意:* 在这个例⼦中,在case语句里面的定义中没有具体代码。

属于对话框范围以外的⼀段。

下面的介绍创建AlertDialog,提供适当例⼦代码。

当要打开带ID的对话框时可以用 showDialog(int) 方法来打开指定ID的对话框。

showDialog(DIALOG_PAUSED_ID);
当你准备关闭对话框,你可以通过调用它的dismiss()方法来进行关闭对话框对象。

如果有必要,你也可以用dismissDialog(int)有效的调用对话框上的dismiss()方法。

如果你使用的 onCreateDialog(int)方法来创建的对话框(参考上⼀节),然后每次你的对话框中被销毁
时,Activity对话框对象都会被保留。

如果你决定将不再需要该对象或把不重要的彻底清除,那么你应该调用removeDialog(int)方法。

如果对话框显示,那么这将从内部消除对象的引用。

使用销毁监听
如果你想在你的应用程序执行到某⼀时刻时,对⼀个对话框进行销毁,那么你应该附加⼀个on-dismiss监听,来监听您的对话框。

首先定义 DialogInterface.OnDismissListener接⼝。

该接⼝有⼀个方法onDismiss(DialogInterface),这将是所谓的当对话框被销毁。

是通过setOnDismissListener().接⼝来实现 OnDismissListener 的监听。

然而,对话框也可以被取消。

在某些特定情况下,用户也会“取消”对话框。

出现在,用户按在返回按钮对对话框进行关闭,或者调用cancel() 方法(也可能是对话框上的⼀个取消按钮)。

当对话框被取消时,就触发OnDismissListener。

但如果你想明确对话框取消方式(不是正常取消),那你要用注册DialogInterface.OnCancelListener里的setOnCancelListener().
AlertDialog是⼀个扩展的对话框类。

它能够创建⼤多数用户界面和推荐的对话框类。

你使用这种对话框时,只要符合下面任何特点就可以使用:
有标题
有正文
有⼀到三个按钮
有列表选择项(单选按钮或者复选框)
使用AlertDialog.Builder ⼦类来创建弹出对话框,用AlertDialog.Builder(Context)方法来创建,在使用create()方法
/images/dialog_buttons.png /images/dialog_list.png
/images/dialog_singlechoicelist.png 后可以对这个弹出对话框进行创建或检索操作。

然后可以用类里的公共方法对所有对话框属性进行定义。

下面例⼦主要讲如何使用AlertDialog.Builder ⼦类后,定义弹出对话框的各种属性。

如果你使用onCreateDialog()方法,在下面的示例代码中,您可以得到返回的对话框对象。

添加按钮
可以使用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)方法取消定义好的对话框。

(所以用户不能用返回按钮关闭对话框),使用⼀个set...Button() 方法,比如setPositiveButton()方法。

在用户设置好按钮名称后定义DialogInterface.OnClickListener 来监听。

* 注意:* 你在⼀个弹出对话框中只能添加⼀种按钮类型。

也就是说,你不能添加多种“已知类型的”按钮 。

这三种类型的按钮是:确定,普通和取消。

通过名字可以看出你的按钮没有任何关系,但是可以帮忙你确定执行哪⼀种类型的操作。

添加列表
可以使用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();
首先用setTitle(CharSequence)给对话框设置⼀个标题。

然后用setItems()添加可以选择列表和对话框接⼝,然后用OnClickListener 方法来监听用户选择项的触发事件。

添加复选和单选按钮
用setMultiChoiceItems() 和setSingleChoiceItems()方法可以在对话框里面添加各自的⼀个多选项(多选框)或单选项(点选
按钮)。

如果你用onCreateDialog() 方法创建⼀个或多个复选项,只要Activity 是激活状态,Android 会帮你管理。

如果用户退出活动,那么选项将会丢失。

* 注意:* 当用户离开或暂停这个Activity 是保存选择,你必须在当前activity 的生命周期中进行保存与恢复。

如果你要在关闭这个活动的进程时要长时间保存这选项,那必须要用⼀个数据变量存储来进行长时间保存。

创建如右图那样的单选列表对话框,可以使用与例⼦相同的代码,但是要把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();
在setSingleChoiceItems() 方法中的第⼆个参数,是针对复选对象的整形值。

当为0时,表示列表选择的是默认项。

当为“-1”时表示没有任何项被选中。

/images/dialog_progress_spinning.png
进度对话框继承弹出对话框类。

它可以在进程任务运行中,显示在前面的⼀个纺车的动画进度条,或者⼀个不确定进度的进度条,对话框会⼀直提供按钮,比如取消下载
用ProgressDialog.show()方法可以简单的打开进度条对话框,例如右侧所示的进度对话框,通过onCreateDialog(int)调用可以轻松实现不用管理的对话框,如下所示:
ProgressDialog dialog = ProgressDialog.show(MyActivity.this, "",
"Loading. Please wait...", true);
第⼀个参数是应用背景,第⼆个参数是标题对话框(左边为空),第三个参数显示信息,和最后⼀个参数是是否显示进度条(这是唯⼀与创建进度条相关,这个在下⼀节讨论)。

默认样式的进度对话框是转轮。

如果你想创建⼀个显示加载进度的进度栏,下⼀节将对更多的必要代码进行讨论。

显示进度条
/images/dialog_progress_bar.png
显示的进展的动画进度条:
1.实例话进度条对话框类的构造函数,ProgressDialog(Context).
2.可以通过 setProgressStyle(int) 来对进度条的样式"STYLE_HORIZONTAL"进行设置,比如:信息
3.当你想显示对话框时,可以调用show()方法,或者在onCreateDialog(int)方法返回进度条对话框。

4.你可以增加进度条的显示值,在框中调用setProgress(int)来设置总的完成百分比的值。

或者用incrementProgressBy(int)方法来设置加到完成的进度。

例如,你的设置可能看起来像这样:
ProgressDialog progressDialog;
progressDialog = new ProgressDialog(mContext);
progressDialog.setProgressStyle(ProgressDialog.STYLE_HORIZONTAL);
progressDialog.setMessage("Loading...");
progressDialog.setCancelable(false);
设置比较简单,但更多的代码是要在主活动的运行中进行创建和更新的。

你会发现在当前活动的界面外必须创建另⼀个线程来管理进度条。

如果你不熟悉使用额外的线程处理程序,看看这个例⼦,是使用另外⼀个线程来增加⼀个进度对话框管理活动。

另⼀线程序进度执行进度条的例⼦。

这个例⼦是用另⼀个线程来跟踪主进线程 (当主活动数字实际到100). 主活动在每时都会发送信息给进度对话框,从而更新进度对话框。

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; /* * 当活动是第⼀次创建. * / public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(yout.main); // 设置按钮开始进度对话框 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..."); return progressDialog; default: return null; } } @Override protected void onPrepareDialog(int id, Dialog dialog) { switch(id) { case PROGRESS_DIALOG: progressDialog.setProgress(0); progressThread = new ProgressThread(handler); progressThread.start(); } // 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.arg1;
progressDialog.setProgress(total); if (total >= 100){ dismissDialog(PROGRESS_DIALOG); progressThread.setState(ProgressThread.STATE_DONE); } } }; /* * 嵌套类,执行进度(记数) * / 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(); msg.arg1 = total; mHandler.sendMessage(msg); total++; } } /* sets the current state for the thread, * used to stop the thread * / public void setState(int state) { mState = state; } }}
/images/dialog_custom.png
如果你想要⼀个定制设计⼀个对话框,你可以使用setContentView(View)方法,通过根视图对象或布局资源身份来定义你的布局,您可以创建自⼰的布局的对话窗⼝布局和部件的元素。

例:创建右边显示的对话框
1.创建XML布局文件,保存为custom_dialog.xml:
这个XML定义了⼀个图片文本框和⼀文本框在同⼀行里。

2.设置上面布局中的图片文本框和文本框里的元素内容与属性。

Context mContext = getApplicationContext(); Dialog dialog = new Dialog(mContext);
dialog.setContentView(yout.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);
在你实例化对话框后,用setContentView(int)通过标识符设置自定义布局对话框的内容视图。

通过findViewById(int) 找到视图对象,然后进行修改。

3.现在你可以看到⼀个显示的对话框了。

用对话框类做⼀个对话框必须要有标题。

如果没你没用setTitle()方法,标题虽然是空的,但是可以看到。

如果你不想设置所有的标题。

你随时可以使用弹出对话框类来创建自定义对话框。

因为AlertDialog.Builder 类,可以创建简单的弹出对话框。

你可以不用执行setContentView(int)方法,相反,你必须用setView(View)方法来设置视图对象,所指向XML文件根视图对象。

在XML中增加好布局,用getLayoutInflater()(或者getSystemService()方法)来检索LayoutInflater。

然后调用inflate(int, ViewGroup)方法。

第⼀个参数是身份标识,第⼆个是根视图身份标识。

在这⼀点上,你可以使用找到视图对象的布局和内容,从而定位在图片框和文本框元素。

实例化AlertDialog.Builder类后再用 setView(View)设置对话框设置布局。

这是⼀个创建自定义对话框布局的例⼦:
AlertDialog.Builder builder; AlertDialog alertDialog;Context mContext = getApplicationContext(); LayoutInflater inflater = (LayoutInflater) mContext.getSystemService(LAYOUT_INFLATER_SERVICE); View layout = inflater.inflate(yout.custom_dialog, (ViewGroup) findViewById(yout_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();
您弹出对话框自定义布局,你可以使用内置对话框像管理按钮,选择列表,标题,图标等功能。

更多信息,请参考Dialog 和AlertDialog.Builder 类.
©eoe移动开发者社区
本文链接: /page/Dialogs。

相关文档
最新文档