Android中的弹出框在被点击时, 无论点击哪个按钮都会关闭窗口。 但是有的情况下我们不需要立即关闭窗口。下面的情况是弹出框中要求用户输入文件名, 并在点击确定时检查文件名的合法性, 不合法则提示用户重新输入, 弹出框要保持在界面上。 点击取消时弹出框消失。 这里通过对控件的反射来实现:
/**our button handler**/
private ButtonHandler bHandler;

//pop up dialog with own button handler
private void popUpDialog(AlertDialog dialog) {
/*
* alert dialog's default handler will always close dialog whenever user
* clicks on which button. we have to replace default handler with our
* own handler for blocking close action.
* Reflection helps a lot.
*/
try {
Field field = dialog.getClass().getDeclaredField("mAlert");
field.setAccessible(true);

//retrieve mAlert value
Object obj = field.get(dialog);
field = obj.getClass().getDeclaredField("mHandler");
field.setAccessible(true);
//replace mHandler with our own handler
field.set(obj, bHandler);
} catch (SecurityException e) {
Debug.error(e.getMessage());
} catch (NoSuchFieldException e) {
Debug.error(e.getMessage());
} catch (IllegalArgumentException e) {
Debug.error(e.getMessage());
} catch (IllegalAccessException e) {
Debug.error(e.getMessage());
}

//we can show this dialog now.
dialog.show();
}
/*
* define our own button handler, do not deal with dismiss message.
*/
class ButtonHandler extends Handler {

private WeakReference<DialogInterface> mDialog;

public ButtonHandler(DialogInterface dialog) {
mDialog = new WeakReference<DialogInterface>(dialog);
}

public void handleMessage(Message msg) {
switch (msg.what) {
case DialogInterface.BUTTON_POSITIVE:
case DialogInterface.BUTTON_NEGATIVE:
case DialogInterface.BUTTON_NEUTRAL:
((DialogInterface.OnClickListener) msg.obj).onClick(mDialog
.get(), msg.what);
break ;
}
}
}

然后创建一个AlertDialog时如下去调用:
//create dialog
mDialog = new AlertDialog.Builder(mContext)
.setView(selectImageView)
.setNegativeButton(android.R.string.cancel, mOnDialogClickListener)
.setPositiveButton(android.R.string.ok, new DialogInterface.OnClickListener() {
public void onClick(DialogInterface dialog, int arg1) {
//check input file name
if (isValidFileName(fileNameInput.getText().toString())) {
String fileName = fileNameInput.getText().toString().trim();
mediaList.get(0).setName(fileName);
saveMedia(mediaList);
dialog.dismiss();
} else {
Toast.makeText(mContext, R.string.invalid_file_name, 1500).show();
}

}
}).create();
mOnDialogClickListener用来处理关闭窗口事件:
/*
* cancel dialog listener
*/
OnClickListener mOnDialogClickListener = new DialogInterface.OnClickListener() {
public void onClick(DialogInterface dialog, int buttonId) {
switch (buttonId) {
case DialogInterface.BUTTON_NEGATIVE:
dialog.dismiss();
break;
case DialogInterface.BUTTON_POSITIVE:

break;
}

}
};

更多相关文章

  1. Android运行时权限策略和easyPermission的使用分析
  2. 谷歌发布基于机器学习的Android(安卓)APP安全检测系统:Google Pla
  3. android activity 属性解释
  4. Android添加用户组及自定义App权限
  5. JDK8的安装及win10配置JDK8的环境变量
  6. Android(安卓)SDK开发包国内下载地址
  7. 深入浅出Android(安卓)Gradle构建系统 (三:build task)
  8. Android(安卓)编年史
  9. android用户界面-菜单

随机推荐

  1. Android(安卓)启动过程框架
  2. 5分钟实现Android最新2018友盟统计
  3. Android(安卓)5.0 开机横屏修改方法
  4. Android广播和广播接收者
  5. android ViewDragHelper介绍
  6. Android资源文件混淆
  7. Android的项目不能直接引用可移植类库的
  8. 一个方便集成的 Android(安卓)右滑返回上
  9. android实现截屏操作
  10. 【经验】android webview 后退键导致表单