Android AlertDialog,don';按下按键时不要关机,但要触摸

本文关键字:AlertDialog 关机 触摸 Android don | 更新日期: 2023-09-27 18:21:49

我找到了在触摸对话框按钮或按下键盘键时取消AlertDialog的解决方案。但是,我只想在按下时取消解雇,触摸按钮应该仍然有效。

例如,如果按键被按下,如何保持AlertDialog打开,但保持按钮触摸功能?

由于我使用的是Xamarin,到目前为止,这里是我的C#代码,但真正的Java解决方案也被接受,因为它们很容易翻译:

构建对话框:

AlertDialog dialog = new AlertDialog.Builder(this)
    .SetTitle("blabla")
    .SetMessage("more bla")
    .SetPositiveButton("OK", (sender2, e2) => {
        // Do something
        SetResult(Result.Ok, oIntent);
        Finish(); })
    .SetNegativeButton("Cancel", (sender2, e2) => { })
    .Create();
dialog.SetOnShowListener(new AlertDialogShowListener(dialog));
dialog.Show();

以及接口的实现:

private class AlertDialogShowListener : Java.Lang.Object, IDialogInterfaceOnShowListener {
    private AlertDialog _dialog;
    internal AlertDialogShowListener(AlertDialog dialog) {
        _dialog = dialog;
    }
    public void OnShow(IDialogInterface dialog) {
        Button b = dialog.GetButton((int)DialogButtonType.Positive);
        b.SetOnClickListener(new ButtonOnClickListener());
        b = dialog.GetButton((int)DialogButtonType.Negative);
        b.SetOnClickListener(new ButtonOnClickListener());
    }
}
private class ButtonOnClickListener : Java.Lang.Object, View.IOnClickListener {
    public void OnClick(View v) {
        // How to NOT dismiss if a _key_ has been pressed?
    }
}

(附言:我知道在Xamarin中有一种更简单的方法可以通过附加Click事件来编写这样的代码,但我认为Java专业人员更容易通过OnShow和OnClick监听器来遵循它。)

Android AlertDialog,don';按下按键时不要关机,但要触摸

我找到了答案!

显示警报对话框后,获取按钮并覆盖它们的onKeyPress方法,这样这些按钮就不会在警报对话框上调用disse。

在C#中,它看起来像这样:

AlertDialog dialog = new AlertDialog.Builder(this)
    .SetTitle("blabla")
    .SetMessage("blablabla")
    .SetPositiveButton("OK", (sender, e) => {
        SetResult(Result.Ok, oIntent);
        Finish();
    })
    .SetNegativeButton("Cancel", (sender, e) => { })
    .Show(); // Important, or GetButton() will return null
// Now disable the default dismissing actions on key presses.
dialog.GetButton((int)DialogButtonType.Positive).KeyPress += (sender, e) => { };
dialog.GetButton((int)DialogButtonType.Negative).KeyPress += (sender, e) => { };