这些天我正在模拟Android中的模态对话框。我用谷歌搜索了很多,有很多讨论,但遗憾的是没有太多选择可以让它成为模态。这里有一些背景,
Dialogs / AlertDialogs:如何在对话框启动时“阻止执行”(.NET 样式)
没有直接的方法来获得模态行为,然后我想出了 3 种可能的解决方案,
1.使用对话主题的活动,就像这个 线程 说的那样,但我仍然不能让主要活动真正等待对话活动返回。主要活动转为停止状态,然后重新启动。
2.构建一个工作线程,并使用线程同步。然而,这对我的应用程序来说是一项巨大的重构工作,现在我在主 UI 线程中都有一个主活动和一个服务。
3. 当有模态对话框时在循环内接管事件处理,当对话框关闭时退出循环。实际上,这是构建一个真正的模态对话框的方法,就像它在 Windows 中所做的那样。我还没有以这种方式进行原型设计。
我仍然想用对话主题的活动来模拟它,
1. 通过 startActivityForResult() 启动对话活动
2. 从 onActivityResult() 获取结果
这是一些来源
public class MainActivity extends Activity {
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
MyView v = new MyView(this);
setContentView(v);
}
private final int RESULT_CODE_ALERT = 1;
private boolean mAlertResult = false;
public boolean startAlertDialog() {
Intent it = new Intent(this, DialogActivity.class);
it.putExtra("AlertInfo", "This is an alert");
startActivityForResult(it, RESULT_CODE_ALERT);
// I want to wait right here
return mAlertResult;
}
@Override
protected void onActivityResult (int requestCode, int resultCode, Intent data) {
switch (requestCode) {
case RESULT_CODE_ALERT:
Bundle ret = data.getExtras();
mAlertResult = ret.getBoolean("AlertResult");
break;
}
}
}
startAlertDialog 的调用者将阻塞执行并期望返回结果。但是 startAlertDialog 当然会立即返回,并且主要活动在 DialogActivity 启动时进入 STOP 状态。
那么问题来了,如何让主要活动真正等待结果呢?
谢谢。
原文由 fifth 发布,翻译遵循 CC BY-SA 4.0 许可协议
以下对我有用(代码在 Kotlin 中,但如果需要,您可以使用 IDE 转换为 Java)。产生警报对话框的关键更改是调用其 setCancelOnTouchOutside 方法,参数为 false。