【发布时间】:2011-09-01 12:15:00
【问题描述】:
这些天我正在研究在 Android 中模拟模态对话框。我用谷歌搜索了很多,有很多讨论,但遗憾的是没有太多选择可以让它成为模态。这里有一些背景,
Dialogs, Modal Dialogs and Blockin
Dialogs / AlertDialogs: How to "block execution" while dialog is up (.NET-style)
没有直接的方法来获得模态行为,然后我想出了 3 种可能的解决方案,
1.使用以对话为主题的活动,就像thread说的那样,但我仍然不能让主要活动真正等待对话活动返回。主要活动转为停止状态,然后重新启动。
2.构建一个工作线程,并使用线程同步。但是,对于我的应用来说,这是一项巨大的重构工作,现在我在主 UI 线程中都有一个主 Activity 和一个服务。
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 状态。
所以问题是,如何让主要活动真正等待结果?
谢谢。
【问题讨论】:
-
这篇文章可能对你有所帮助。 stackoverflow.com/questions/2028697/…
-
我真的不敢相信 Android 会在这个非常简单的东西上糟透了。
-
您问题中的第一个链接说明 Android 确实 有模型对话框(但没有阻止)。如果您更改术语以反映您真正要求的内容 - 线程阻塞,您的问题会更加清晰。
-
使用广播接收器调用链中的下一个方法...死锁代码直到方法被调用。
-
Android 不支持模式对话框让 Google 感到羞耻。我相信他们应该解决这个问题。作为程序员,我们应该说服 Google 做正确的事情,而不是重新发明一种类似对话框的模式。模式对话框已经存在并由 Microsoft 在 Windows 中实现。为什么不由 Google 实施?因为 Google 工程师很懒 ;-)
标签: android android-activity synchronization modal-dialog