在项目开发。经常使用对话框,Android该对话框是异步,后再继续运行。
以下以使用AlterDialog对话框返回true或者false之后,主程序再继续运行为例讲述怎样实现主程序等待对话框响应后再顺序运行的方法。
思考一:
首先考虑到声明一个final keyword的布尔型的局部变量,然后在对话框的“确认”和“取消”button的点击事件中对布尔型变量进行赋值。然后再运行主程序。
问题一:在代码的过程对布尔型变量进行赋值的时候提示错误。
错误例如以下: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