最近参加一个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