Android创建阻塞式模态对话框Dialog-Loop的实现方式
【Android创建阻塞式模态对话框Dialog-Loop的实现方式】由于Android的Dialog是非阻塞的方式,每次弹出一个输入框或确认操作框都需要实现回调接口和处理回调方法。某些比较简单的需求,可以不通过监听回调的方式来实现,直接创建阻塞式模态对话框,关闭后直接返回结果。实现原理:
系统显示一个对话框后,利用Loop.loop()方法,使主线程阻塞,在用户点击按钮后抛出一个RuntimeException异常,大家知道这个异常时不用捕获也不用抛出的,这样就直接强制终止了Loop的状态。主线程继续,但是这时候输入结果已经出来了,也就达到了我们想要的效果。
创建一个对话框类:
public class PasswordDialog extends Dialog
{
int dialogResult;
Handler mHandler ;
public PasswordDialog(Activity context, String mailName, boolean retry)
{super(context);
setOwnerActivity(context);
onCreate();
TextView promptLbl = (TextView) findViewById(R.id.promptLbl);
promptLbl.setText("请输入密码/n" + mailName);
}
public int getDialogResult()
{
return dialogResult;
}
public void setDialogResult(int dialogResult)
{
this.dialogResult = dialogResult;
}
/** Called when the activity is first created. */public void onCreate() {
setContentView(R.layout.password_dialog);
findViewById(R.id.cancelBtn).setOnClickListener(new android.view.View.OnClickListener() {@Override
public void onClick(View paramView)
{
endDialog(DialogResult.CANCEL);
}
});
findViewById(R.id.okBtn).setOnClickListener(new android.view.View.OnClickListener() {@Override
public void onClick(View paramView)
{
endDialog(DialogResult.OK);
}
});
}public void endDialog(int result)
{
dismiss();
setDialogResult(result);
Message m = mHandler.obtainMessage();
mHandler.sendMessage(m);
}public int showDialog()
{
mHandler = new Handler() {
@Override
public void handleMessage(Message mesg) {
// process incoming messages here
//super.handleMessage(msg);
throw new RuntimeException();
}
};
super.show();
try {
Looper.getMainLooper().loop();
}
catch(RuntimeException e2)
{
}
return dialogResult;
}}
调用方式:
if(new PasswordDialog(getActivity(),"",true).showDialog() == PasswordDialog.OK) {
...
}
else {
...
}
推荐阅读
- 【Android】RecyclerView(打造悬浮效果)
- 关于MAC M1处理器运行Android protoc报错的解决方案
- CPI教程-异步接口创建及使用
- springboot中内置tomcat什么时候创建的,又是什么时候启动的()
- 硬件开发笔记: 硬件开发基本流程,制作一个USB转RS232的模块(创建基础DIP元器件(晶振)封装并关联原理图元器件)
- 我理解的Android|Material Design组件 - 使用BottomSheet展现扩展内容(一)
- Android实现自定义曲线图
- Android运动健康睡眠自定义控件的实现
- JavaEE初阶|创建一个线程——— Javaweb (3)
- 创建Deployment后,无法创建Pod问题处理