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();
这里有一点需要注意,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
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代表不选中。
怎么样?是不是感觉很方便有没有!如果这样你就感觉很方便的话那你也太容易满足了,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里。