想象一下这样的一个情景:弹出一个对话框,里面可以编辑sql语句,编辑好以后点击确定按钮,执行sql,此时对话框也会消失。如果sql顺利执行,这种交互还是很不错的。但是一旦sql执行出错,对话框还是会关闭,对话框中的sql也就没有了,只能重新编辑。如果sql很复杂,那么这种交互完全可以毁掉你的这个应用。好比注册信息,填了n多项,只有一项出错,界面却把所有填好的信息都丢失掉...用户会恨不得杀了你、
dialog在默认情况下只要你点击了它的按钮,它都要进行关闭,为了在上述情况中拥有良好的交互性,必须得找出一种办法,可以让dialog在需要关闭的时候再进行关闭。
下段代码也是在网上找的,并非自己研究,特此声明。
public class DialogDemo extends Activity {
AlertDialog dialogDemo;
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
AlertDialog.Builder dialogBuild = new AlertDialog.Builder(this);
dialogBuild.setPositiveButton("sure", new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialog, int which) {
if (true) {
//该条件下不关闭dialog
keepDialogOpen(dialogDemo);
//...doSomeThing();
} else {
//该条件下关闭dialog
closeDialog(dialogDemo);
//此句最好不要省略,否则在有些情况下dialog不关闭
dialog.dismiss();
}
}
});
dialogBuild.setNegativeButton("cancel", new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialog, int which) {
//取消按钮在任何条件下都关闭
closeDialog(dialogDemo);
//此句最好不要省略,否则在有些情况下dialog不关闭
dialog.dismiss();
}
});
dialogDemo = dialogBuild.create();
dialogDemo.show();
}
//保持dialog不关闭的方法
private void keepDialogOpen(AlertDialog dialog) {
try {
java.lang.reflect.Field field = dialog.getClass().getSuperclass().getDeclaredField("mShowing");
field.setAccessible(true);
field.set(dialog, false);
} catch (Exception e) {
e.printStackTrace();
}
}
//关闭dialog的方法
private void closeDialog(AlertDialog dialog) {
try {
java.lang.reflect.Field field = dialog.getClass().getSuperclass().getDeclaredField("mShowing");
field.setAccessible(true);
field.set(dialog, true);
} catch (Exception e) {
e.printStackTrace();
}
}
}
通过上面两个方法,我们可以根据需求来控制dialog的关闭和显示。
|