Android dialog用法(三)

显示对话框

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

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

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

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

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

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

使用消除侦听器Using dismisslisteners

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

  1. @Override
  2. protected void onPrepareDialog(int id, Dialog dialog) {
  3. switch(id){
  4. case PROGRESS_DIALOG:
  5. dialog.setOnDismissListener(newDialogInterface.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.OnCancelListeneronCancelListener)
  3. //Dialog调用的
  4. public void setOnCancelListener (DialogInterface.OnCancelListenerlistener)
警告对话框AlertDialog的使用

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

Dialog_buttonDialog_buttonDialog_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)。然后,开始函数链并设置该对话框为不能取消notcancelable (因此用户不能使用返回按钮关闭这个对话框)。对每个按钮,使用任一set...Button()方法,比如setPositiveButton(),该方法接受按钮名称以及一个定义用户选中按钮后所采取动作的DialogInterface.OnClickListener

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

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

增加复选框和单选按钮

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

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

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

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

进度对话框Progress Dialog的使用

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

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

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

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


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值