在项目开发中,经常会用到对话框,Android的对话框都是异步进行的,但是有时候需要实现主程序等待对话框响应后再继续执行。下面以使用AlterDialog对话框返回true或者false之后,主程序再继续运行为例讲述如何实现主程序等待对话框响应后再顺序执行的方法。
思考一:
首先考虑到声明一个final 关键字的布尔型的局部变量,然后在对话框的“确认”和“取消”按钮的点击事件中对布尔型变量进行赋值,然后再执行主程序。
问题一:在代码的过程对布尔型变量进行赋值的时候提示错误。
错误如下:The final local variable xxx cannot be assigned, since it is defined in an enclosing type 其中xxx是一个局部变量名,首先这是一个java编译时的错误,翻译成中文是:不可变的局部变量不能被赋值,因为它已经被定义在一个封闭类型中。
解决办法:将xxx 作一下封装,用集合或者数组,如果xxx是基本数据类型一般用数组。
如:xxx为 String类型的话,可以封装成 String[] xxx=null;然后在接下来用到 xxx 变量的地方, 将xxx 写成 xxx[0];xxx 如果为对象的话,那么可以用集合 将xxx进行封装。
问题二:对话框是异步的,也就是说在等待对话框执行的过程中,主程序也在运行。
其实可以使用全局变量,只是在调用对话框之后不能写需要对话框返回值有关的代码,然后等对话框响应之后,在主程序中再设置一个触发,然后继续执行主程序,这样是可行,但是有时候不符合用户的习惯。
因为问题二的存在思考一的方法不能实现。
思考二: 给AlterDialog创建监听器。
下面代码在调用对话框之后同样也不能写需要对话框返回值有关的代码,但是对话框响应之后不需要再设置触发,其实本质上来说也就是用设置监听器的方法在主程序中设置一个触发,其实针对思考一中的问题二的一种解决方法。
代码如下:
1. MyInterface.java
public class MyInterface {
DialogReturn dialogReturn;
public interface DialogReturn {
void onDialogCompleted(boolean answer);
}
public void setListener(DialogReturn dialogReturn) {
this.dialogReturn = dialogReturn;
}
public DialogReturn getListener() {
return dialogReturn;
}
}
2.Main.java
public class Main extends Activity implements MyInterface.DialogReturn{
MyInterface myInterface;
MyInterface.DialogReturn dialogReturn;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
....
myInterface = new MyInterface();
myInterface.setListener(this);
}
public void Confirm(Context context) {
AlertDialog dialog = new AlertDialog.Builder(context).create();
dialog.setTitle("Confirmation");
dialog.setMessage("Choose Yes or No");
dialog.setCancelable(false);
dialog.setButton(DialogInterface.BUTTON_POSITIVE, "Yes",
new DialogInterface.OnClickListener() {
public void onClick(DialogInterface dialog, int buttonId) {
myInterface.getListener().onDialogCompleted(true);
}
});
dialog.setButton(DialogInterface.BUTTON_NEGATIVE, "No",
new DialogInterface.OnClickListener() {
public void onClick(DialogInterface dialog, int buttonId) {
myInterface.getListener().onDialogCompleted(false);
}
});
dialog.setIcon(android.R.drawable.ic_dialog_alert);
dialog.show();
}
@Override
public void onDialogCompleted(boolean answer) {
Toast.makeText(Main.this, answer+"", Toast.LENGTH_LONG).show();
if(answer)
// do something
else
// do something
}
}
上述代码可以对比控件添加监听器来理解。
参考网址:http://ask.csdn.net/questions/464