最近参加一个android的应用程序设计比赛,隔了有点久,忘得差不多了,基本上遇到一问题(都不是什么大问题比如对话框如何创建)就Google,贴了代码试一下,成功了就关掉网页,继续敲代码,又遇到创建对话框,又跑去那个页面在贴点代码过来。技术没学会,应用全是别人的代码。觉得有完整的学习一下android的对话框创建,毕竟对话框在android的应用当中经常用到。但是由于本文很多是dev guide中的英文翻译,所以不是很好的代码源,如果是像我先前那样饥渴的寻找代码的话,我觉得还是静下心来,完整学习一下。

Dialog是创建对话框的基类,但是你很少直接实例化Dialog。

首先对话框出现时activity的状态。对话框是作为activity的一部分被创建和显示,当一个Dialog出现时,当前正在活动的activity会进入暂停状态,会执行OnPause()函数,当对话框消失时执行OnResume()。

创建并显示一个对话框。对话框一般是通过Activity的OnCreateDialog(int dialogId)回调函数创建,当然也可以不在OnCreateDialog中创建,只不过后者没有和Activity建立关系。前者和Activity建立了联系。(文档上说建立了联系之后,Dialog也继承了Activity的一些属性,比如当一个对话框打开时,菜单按钮会调用Activity定义的选项菜单,音量会调节activity使用的媒体的音量(但测试了一下,好像不能调用菜单,不知道是不是我翻译的有问题))。不过还是推荐使用第一种方法,第一种方法创建和调用显示对话框都比较简洁,可读性很强。

如果选择第一种方法,显示对话框调用showDialog(int),对话框会调用OnCreateDialog(int),后者接受的int参数和传递给showDialog的int一样,调用后者是为了实例化一个Dialog对象。在对话框显示之前OnPrepareDialog会被调用,因为OnCreateDialog一般仅在对话框第一次打开的时候被调用,所以OnPrepareDialog可以在每次对话框被显示的时候做一些调整,比如根据程序情况对对话框中的显示的内容作调整.OnPrepareDialog原型OnPrepareDialog(int,Dialog)。Dialog就是现在创建好的Dialog实例。因为在一个activity中可能要创建多个对话框,所以回调函数中使用switch语句是很方便的,即使只有一个对话框,日后也会很方便扩展。显示对话框可以直接使用对话框的show()方法。

接触一个对话框可以直接调用对话框的dismiss方法,也可以调用dismiss(int id),这与显示对话框是对应的。后者更有效率。调用dismiss对话框对象并不会被销毁,如果对话框是由OnCreateDialog创建的,dismiss后的状态是有Activity管理的。如果你需要彻底销毁Dialog对象则调用removeDialog,此函数清除所有对此对话框对象的应用,如果对话框还是显示的,则还会dismiss掉。你还可以为dimiss时间注册事件监听器OnDismissListener。当用户按Back或直接调用cancel,对话框会被取消。这同样会触发OnDismissListener。但是对于对话框的取消,有一个特定的监听器OnCancelListener。设置这些监听器的方法都是对对话框对象调用setOnxxxxListener。

上面是讲对话框的创建,显示,解除的大体框架。下面是一个对话框对象的具体创建。

对话框对象一般是从AlertDialog,ProgressDialog,DatePickerDialog,TimePickerDialog创建,有特殊需要的话,你可以直接继承Dialog或继承它的任意子类,来定制自己的对话框。

AlertDialog是比较常用的对话框,如果你有如下显示需求,则可以使用它。一个标题;一段文本信息;1~3个按钮;一个可选择的列表(checkbox,radio or just message)。创建AlertDialog使用AlertDialog.Builder,原型为AlertDialog.Builder(Context),使用Builder的其他方法设置对话框的属性,最后调用它的create创建对话框。Builder设置对话框属性.setTitle设置标题 ,setCustomTitle设置定制标题 ,setMessage设置显示消息 ,setIcon设置图标, setView定制对话框容 ,setCancelable设置对话框可取消 setItems设置可选择列表 setSingleChoiceItem设置单选项 (第二个参数设置默认选项) setMultiChoiceItems设置多选项(第二个参数设置多选项中的默认项(数组)) (后面的两个单选和多选会在对话框被解除之后,第二次开启的时候会记录上次的选择) 贴段代码;

   1: final CharSequence[] items = {"Red", "Green", "Blue"};
   2:  
   3:             AlertDialog.Builder builder = new AlertDialog.Builder(this);
   4:             builder.setTitle("Pick a color");
   5:             builder.setMultiChoiceItems(items, new boolean[]{true,true,false}, new DialogInterface.OnMultiChoiceClickListener() {   7:                 @Override
   8:                 public void onClick(DialogInterface dialog, int which, boolean isChecked) {
   9:                     Log.d(TAG,”Multi Click Changed”);
  10:                     
  11:                 }
  12:             });

设置多选的时候监听器是OnMultiChoiceClickListener,设置单选及列表时监听器是OnClickListener。

另一个比较常用的对话框类型是ProgressDialog,ProgessDialog有两种形式,一种是进度条形式,一种是一个不断滚动的圆圈形式。ProgressDialog是直接实例化的,没有使用Builder,不过还是可以使用ProgressDialog实例设置对话框的属性.setProgressStyle()设置风格,和builder一样设置标题和显示消息。如果需要更精确的设置进度条的状态,则需要

   1: ProgressDialog progressDialog;
   2: progressDialog = new ProgressDialog(mContext);
   3: progressDialog.setProgressStyle(ProgressDialog.STYLE_HORIZONTAL);//设置风格
   4: progressDialog.setMessage("Loading...");
   5: progressDialog.setCancelable(false);

setProgress和incrementProgressBy改变进度条状态。

如果这些还没有满足你的要求,则可以自定义对话框

第一对话框显示的Xml文件;调用对话框的setContentView()设置视图;显示

其实可以基于AlertDialog.Builer自定义对话框,这样可以使用Builder的一些已有属性的便利,builder的setView(View)接受View,所以需要使用LayoutInflater从xml获得view对象。贴段代码

   1: AlertDialog.Builder builder;
   2: AlertDialog alertDialog;
   3:  
   4: Context mContext = getApplicationContext();
   5: LayoutInflater inflater = (LayoutInflater) mContext.getSystemService(LAYOUT_INFLATER_SERVICE);
   6: View layout = inflater.inflate(R.layout.custom_dialog,
   7:                                (ViewGroup) findViewById(R.id.layout_root));
   8:  
   9: TextView text = (TextView) layout.findViewById(R.id.text);
  10: text.setText("Hello, this is a custom dialog!");
  11: ImageView image = (ImageView) layout.findViewById(R.id.image);
  12: image.setImageResource(R.drawable.android);
  13:  
  14: builder = new AlertDialog.Builder(mContext);
  15: builder.setView(layout);
  16: alertDialog = builder.create();

具体的可以参考Dev Guide中关于Dialog的部分Dialog


更多相关文章

  1. Android实用视图动画及工具系列之四:多状态CheckBox,可设置大小尺
  2. Android(安卓)Canvas类介绍和Android(安卓)Draw Rect 坐标图示
  3. Linux文件的特殊权限位SUID、SGID作用及编程设置/读取
  4. Android(安卓)设置页面的设计
  5. Android应用程序资源管理器(Asset Manager)的创建过程分析
  6. Android:增强目录选择器对话框
  7. Android(安卓)Notification 详解,使用MediaPlayer一直播放系统铃
  8. Android(安卓)之 Window、WindowManager 与窗口管理
  9. android:布局参数,控件属性及各种xml的作用

随机推荐

  1. HTML,CSS - 长表的行中断需要修复
  2. 样式通常以相同的组合出现:创建单个类还是
  3. 如何在Java Swing中的JPanel中呈现基本的
  4. 单个元素html上的多个类
  5. 如何使用jQuery在我的网站演示中自动填写
  6. JQuery基于元素的高度添加类
  7. HTML之表格篇——表格的嵌套
  8. 怎么动态设置html的canvas元素的尺寸?
  9. 如何在bootstrap中添加汉堡包菜单
  10. js去掉html标签和去掉字符串文本的所有的