Android:如何获得模态对话框或类似的模态行为?

新手上路,请多包涵

这些天我正在模拟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 许可协议

阅读 714
1 个回答

以下对我有用(代码在 Kotlin 中,但如果需要,您可以使用 IDE 转换为 Java)。产生警报对话框的关键更改是调用其 setCancelOnTouchOutside 方法,参数为 false。

 override fun onCreateDialog(savedInstanceState: Bundle?): Dialog {
    val builder = getContext()?.let { AlertDialog.Builder(it) }
    var ret: Dialog = super.onCreateDialog(savedInstanceState)
    // Get the layout inflater
    val inflater: LayoutInflater? = getActivity()?.getLayoutInflater()
    m_view = inflater?.inflate(R.layout.select_clinic_dialog, null)

    if (builder != null) {
        builder.setView(m_view) // Add action buttons
            .setPositiveButton(R.string.label_continue,
                DialogInterface.OnClickListener { dialog, id ->
                    val i = Intent(getContext(), PatientSearchActivity::class.java)
                    startActivity(i)
                    getActivity()?.finish()
                    dialog.dismiss()
                })
            .setNegativeButton(R.string.register_no,
                DialogInterface.OnClickListener { dialog, id -> val i = Intent(getContext(), LoginActivity::class.java)
                    startActivity(i)
                    getActivity()?.finish()
                    dialog.dismiss() })
        ret = builder.create()
        ret.setTitle(R.string.title_no_clinic_today)
        ret.setOnShowListener(OnShowListener {
            val positive: Button = ret.getButton(AlertDialog.BUTTON_NEGATIVE)
            positive.isFocusable = true
            positive.isFocusableInTouchMode = true
            positive.requestFocus()
        })
        ret.setCanceledOnTouchOutside(false)
    }
    return ret
}

原文由 slogan621 发布,翻译遵循 CC BY-SA 4.0 许可协议

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题