【问题标题】:How to disable back button when popup window dialog is showing?显示弹出窗口对话框时如何禁用后退按钮?
【发布时间】:2018-06-01 05:42:33
【问题描述】:

我有一个弹出窗口,里面有一个EditText 输入。弹出窗口的创建如下所示:

Boolean focusable = true; popupWindow = new PopupWindow(popupView, width, height, focusable);

这一切都很好,EditText 可以输入。当用户单击 android 手机上的后退按钮时,就会出现问题。后退按钮关闭弹出窗口。这不应该发生,因为意图是用户在与弹出窗口进行交互之前无法继续。

现在,我们当然可以将弹出视图的焦点设置为false,以禁止通过后退按钮关闭:

Boolean focusable = false; popupWindow = new PopupWindow(popupView, width, height, focusable);

现在的问题是EditText 没有获得它需要能够键入的焦点。因此,用户无法与EditText进行交互

知道如何通过弹出视图或EditText 解决这个问题吗?

编辑:

所以我尝试用记录器覆盖主活动上的onBackPress方法,以检查活动中是否调用了监听器:

  @Override
    public void onBackPressed() {
        super.onBackPressed();
        Logger.d("isthistriggered");
        finish();
    }

事实证明,onBackPressed 在弹出窗口处于活动状态时不会被调用。一旦你第二次按下后退按钮,它就会触发监听器。

【问题讨论】:

  • 当您在其范围之外单击时,您的弹出窗口是否也会消失?
  • @Umair 弹出窗口覆盖了整个视图,因此没有机会在范围之外点击
  • 如果它适合你,请检查我的答案。快速学习者的回答实际上会关闭弹出窗口。

标签: android


【解决方案1】:

MainActivity中放置静态方法removePopupWindow(view v), 并在onBackPressed() 中调用它,例如MainActivity.removePopupWindow(popWindow);

【讨论】:

    【解决方案2】:

    如果正在显示 PopupWindow,onBackPressed 将不会立即传递给 Activity,因此任何覆盖它和执行操作的努力都是徒劳的。实现它的一种方法是创建您的 CustomView 并覆盖 dispatchKeyEventPreIme()。您可以关注描述此方法的 SO

    【讨论】:

    • 从测试来看似乎是真的。我去看看谢谢。
    • 你知道有一种方法可以让PopupWindow 的内部聚焦而外部不聚焦吗? (即EditText 问题)
    • AFAIK 这是不可能的。但我不是 100% 确定。
    • 谢谢,看来 CustomView 可能会是这样的路径。或者我可能使用错误的构造 (PopupView) 来实现它,因为它需要输入。如果我只是将其作为布局的一部分然后隐藏、取消隐藏,您认为这会更容易吗?
    【解决方案3】:

    当对话框显示时,您必须处理后退按钮的按下

    只需覆盖 onBackPressed() 在您的活动中

    并全局声明弹窗对象

     @Override
    public void onBackPressed() {
        if (popupWindow != null && popupWindow.isShowing()) {
            popupWindow.dismiss();
        } else {
            super.onBackPressed();
        }
    }
    

    【讨论】:

    • 我正在使用 PopupWindow 元素。 developer.android.com/reference/android/widget/PopupWindow。我应该把onBackPressed放在这里,触发popupWindow的活动?
    • 是的,在活动中你必须覆盖 onBack 按下并全局声明弹出窗口对象
    • 试试这个,让我知道它是否有效,我正在等待
    • 试过了。当单击后退按钮并关闭弹出窗口时,它不会触发OnBackPressed。它在弹出窗口被关闭并且您再次单击后退按钮后触发。
    • 我刚刚尝试了日志,看看它是否触发了onBackPressed。 ` @Override public void onBackPressed() { super.onBackPressed(); Logger.d("isthistriggered");结束(); } `
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多