AlertDialog使用总结

 分类:Android, Java 阅读 (3,372)  No Responses »
5月 112013
 

  AlertDialog直接继承自Dialog类,可以用于显示确认提示框或者列表选择框,还可以用于显示有自定义布局的提示框,Android中内置的ProgressDialog、DatePickerDialog和TimePickerDialog都是继承自于该对象。

AlertDialog的创建

  AlertDialog的实例化函数是声明的protected的,所以不能直接通过new AlertDialog(context)来创建,而是要通过它的一个子类Builder来创建,AlertDialog的很多属性也是通过这个builder对象来实现的。

AlertDialog的区域

  AlertDialog从上到下共分3个区域,即标题区、内容区和控制按钮区。

  • 标题区用于显示提示框的标题,给用户简单提示此提示框是什么用途的。我们可以通过builder的setTitle方法来设置标题的内容。
  • 内容区可以放置详细的操作提示、信息提示或者选择列表,也可以使用自定义的Layout显示更为丰富的内容。
  • 按钮区用于放置操作按钮,最多可放置三个按钮,一个确定按钮,一个否定按钮,一个中性按钮,就如Windows程序中常见的“是、否和取消。我们可以通过setPositiveButton、setNegativeButton和setNeutralButton来设置三个按钮的显示内容和点击时的响应函数

在AlertDialog中显示一个选择列表

  AlertDialog.Builder提供了几种方法可以用于在内容区域显示一个可选择的列表框,这几种方法分别是setAdapter、setItems、setSingleChoiceItems、setMultiChoiceItems。

  • setItems(int itemsId, final OnClickListener listener)可以传入一个CharSequence数据或者一个数组资源R.array,但是此方法显示的列表的样式没办法改变,只能使用AlertDialog默认的样式,而且只能显示一列,数据只能是字符串类型。如果给后面的listener传入null值则点击列表的项目后窗口不会自动关闭。
  • setAdapter可以传入一个ListAdapter,开发者可以通过这个ListAdapter对象设计复杂的列表布局,以增加程序的可视化效果。
  • setSingleChoiceItems可以打开一个右侧带单选按钮的提示框,可接受CharSequence数组、资源数组、ListAdapter、Cursor对象,传入CharSequence数组、资源数组时右侧会显示一个单选按钮,传入ListAdapter时右侧无单选按钮,需要自己来实现单选按钮,Cursor未测试。当选择某项时,提示框不会自己关闭,而是要通过返回键或者下面的按钮来关闭提示框。
  • setMultiChoiceItems可以打开一个右侧带复选按钮的提示框,可接受CharSequence数组、资源数组、Cursor对象,不知道为什么没有支持ListAdapter。

AlertDialog中显示自定义部局

  当我们需要一个复杂的提示框的时候,我们可用自定义的Layout来填充到AlertDialog窗口中。这里主要用到的是Builder的setView方法。我们可以先用getLayoutInflater()或者getActivity().getLayoutInflater()来获取一个LayoutInflater对象,然后用View dlgV=inflater.inflate(R.layout.custom_dialog, null);得到一个View对象,然后再用setView方法将自定义部局填充到AlertDialog中。

  虽然我们可以在自定义部局中设计自己的标题和按钮,但我们仍然还可以使用setTitle和setPositiveButton等方法来使用AlertDialog中的标题栏和按钮。

  如果我们想将一个Activity转换成一个Dialog,并不需要再创建一个AlertDialog然后重新实现这些代码,只需要在AndroidManifest.xml中将Activity的Theme设置为Dialog样式的主题即可,如:

AlertDialog内容区域的优先级

  AlertDialog中详细提示信息和选择列表是不能同时显示的,几个方法的优先显示顺序为setMessage、setAdapter、setItems

Activity如何转换成Dialog

  当我们想把一个Activity转换成Dialog时,如果再建立一个AlertDialog或者DialogFragment来实现的话,很多代码都要进行修改,比如DialogFragment需要增加getActivity来实现对Activity的一些方法进行访问,也不支持设计时设置的android:onclick属性,需要在java代码中用setOnClickListener来执行单击事件,这样做起来相当的麻烦。

  那么比较简单的方法就是通过在AndroidManifest.xml中给该Activity设置一个Dialog使用的Theme来进行支持,这样做的缺点是如果使用的不是android的主题则需要自己写一个符合程序的主题。

 如何设置AlertDialog的样式

  我们需要先定义一个样式,在res/values/style.xml中定义一个MyAlertDialog的样式(此方法暂时不可用,设置效果总不是想要的效果,再研究后再发布过来)

  在代码中,创建builder的时候传入这个样式名称,如下:

点击此处下载AlertDialogTest代码