Android之不一样的AlertDialog

AlertDialog是Android中的一个标准的对话框,呈献给用户的是一个对话框样式的界面。在我们Android开发过程中会经常被使用,接下来我会逐渐向大家介绍AlertDialog的一些比较另类的使用方式。

1、在AlertDialog中,把字符串数组作为数据源以列表的方式显示。

一般我们显示一个列表,通常会用ListView,只显示字符串的话用ArrayAdapter就够了,所以要显示在aleAlertDialog中的话就写个包含listview的view,然后用AlertDialog的setview方法设置。。。具体我就不详述了,相信大家都会。但是这种方式感觉比较麻烦,又要自己写布局,又要找id,想想都烦,幸运的是,aleAlertDialog给我们提供了一种很方便的方式,AlertDialog.Buidler.setItems方法可以将一个String数组以列表的方式显示在对话框中:

String[] foods = { "饺子", "米饭", "面条" };
		alertDialog = new AlertDialog.Builder(this).setTitle("标题")
				.setPositiveButton("确定", new OnClickListener() {

					@Override
					public void onClick(DialogInterface dialog, int which) {

					}
				}).setNegativeButton("取消", new OnClickListener() {

					@Override
					public void onClick(DialogInterface dialog, int which) {

					}
				}).setItems(foods, new OnClickListener() {
                    
                    @Override
                    public void onClick(DialogInterface dialog, int which) {
                        Toast.makeText(getApplicationContext(), foods[which], 0).show();
                    }
                }).create();
		Window window = alertDialog.getWindow();

		window.setGravity(Gravity.TOP | Gravity.LEFT);
		alertDialog.show();
Android之不一样的AlertDialog_第1张图片

这里有一点需要注意,setMessage和setItems不能同时使用,否则效果出不来。

2、上面已经显示了列表,那么还能不能显示更复杂一点的布局呢?答案是肯定的,我们还可以在AlertDialog上显示单选列表(带选项按钮的列表),也可以显示多选列表(带复选框的列表):

setSingleChoiceItems(foods, 0, new OnClickListener() {
					
					@Override
					public void onClick(DialogInterface dialog, int which) {
						Toast.makeText(getApplicationContext(), foods[which], 0).show();
					}
				})
第一个参数是数据源,第二个是默认选中的项,小于0或者大于数据源的长度都默认不选中。第二个是点击监听,可以为null

Android之不一样的AlertDialog_第2张图片

setMultiChoiceItems(foods, new boolean[]{false,true,false}, new OnMultiChoiceClickListener() {
					
		@Override
		public void onClick(DialogInterface dialog, int which, boolean isChecked) {
			Toast.makeText(getApplicationContext(), foods[which], 0).show();			
			}
		})
第二个参数和上一个有些不同,它是一个是否选中的数组,true代表选中,false代表不选中。

Android之不一样的AlertDialog_第3张图片

怎么样?是不是感觉很方便有没有!如果这样你就感觉很方便的话那你也太容易满足了,AlertDialog还有一个setAdapter(adapter, listener)方法,感兴趣的可以自己去试下。

3、我们都知道AlertDialog弹出的对话框无论单击任何按钮都会关闭对话框,那么怎么样才能在点击了按钮以后对话框不被关闭呢?如果想实现这个就需要到Dialog类里面去找了,

private boolean mShowing = false;
/**
     * @return Whether the dialog is currently showing.
     */
    public boolean isShowing() {
        return mShowing;
    }
 void dismissDialog() {
        if (mDecor == null || !mShowing) {
            return;
        }
我们注意到在dismissDialog方法中,如果mShowing这个属性为false的话方法就会返回,也就是说,dialog不会被dismiss掉。所以我们想实现上面所说道的功能的话,在点击按钮的事件中把mShowing这个属性设为false就可以了,至于如何去设值,那就不能指望android的api了,只有通过反射去改变了,
try {
			Field field = alertDialog.getClass().getSuperclass()
					.getDeclaredField("mShowing");
			field.setAccessible(true);
			field.set(alertDialog, isDismiss);
		} catch (NoSuchFieldException e) {
			e.printStackTrace();
		} catch (IllegalAccessException e) {
			e.printStackTrace();
		} catch (IllegalArgumentException e) {
			e.printStackTrace();
		}
这样就可以在用户点击了按钮以后,由我们来控制在何时关闭dialog了。代码很简单,就不多说了,所有代码都在demo里。

Android之不一样的AlertDialog_第4张图片
点击下载demo

你可能感兴趣的:(android,反射,dialog,AlertDialog,dialog自定义关闭时间)