我的PopupWindow一直在窃取EditText的焦点

时间:2017-04-19 03:50:38

标签: android android-edittext popup focus

我有一个简单的“命令对话框”,它是一个包含EditText和几个按钮的PopupWindow。我想要以下行为:

  • 在弹出窗口外触摸即可解散它
  • 当弹出窗口出现时,EditText应该抓住(并保持)焦点

我的EditText看起来像这样:

<EditText
    android:id="@+id/send_cmd_text"
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:maxLines="1"
    android:hint="@string/send_cmd_hint"
    android:textColor="#FFFFFF"
    android:minEms="100"
    android:layout_marginLeft="3dp"
    android:layout_marginRight="3dp"
    android:textColorHint="#BBBBBB"
    android:inputType="text"
    android:imeOptions="actionSend" >

    <requestFocus />
</EditText>

弹出窗口结构如下所示:

    val popup = PopupWindow(view)
    popup.isOutsideTouchable = true
    popup.isTouchable = true
    popup.isFocusable = true
    popup.contentView = view

    // This bizarre hack allows outside touching to dismiss it.
    popup.setBackgroundDrawable(ColorDrawable(Color.TRANSPARENT))

    sendButton.setOnClickListener {
        sendCommand()
        popup.dismiss()
    }

    if (A.isHardwareKeyboardAvailable()) {
        // This only fires for the hardware keyboard.
        editText.setOnKeyListener { _, code, event -> handleKey(code, event) }
    } else {
        setImeListener()
    }

    editText.requestFocus()

似乎出现了竞争状况。我有一个附加的硬件键盘,有两种方法可以打开弹出窗口:

  1. 我可以点击活动注意到的Enter键,然后调用该功能来构建并显示弹出窗口。
  2. 我可以在我的UI中按一个按钮,该按钮调用相同的功能。
  3. 每当我按下按钮打开弹出窗口时,EditText就会得到焦点,每个人都很高兴。

    每当我按下硬件键盘上的Enter键打开弹出窗口时,EditText会短暂获得焦点,然后变得没有焦点。我怀疑没有证据证明PopupWindow正在窃取焦点。

    我需要弹出窗口是可聚焦的 - 否则按键只会转到Activity,在那里很难将它们路由回EditText。

    我还需要弹出窗口可以在外面触摸,所以当你触摸外面时它会被忽略。

    我已经尝试将isTouchable设置为false,但它似乎无论如何都没有效果。

    我已经尝试过与此问题相关的各种古怪建议,例如调用popup.update()等等。没有什么能解决问题。

    同样,当我通过按Enter键打开弹出窗口时,只发生 。我能看到的唯一区别是,在创建弹出窗口之前,Activity可能会暂时获得焦点,而如果我按下UI按钮打开弹出窗口,则Activity永远不会获得键盘焦点。但不确定。

    唯一能为我工作的是设置一个计时器:

        android.os.Handler().postDelayed({ editText.requestFocus() }, 250)
    

    这就是诀窍,但显然是蹩脚和脆弱。

    知道如何阻止我的弹出窗口从其内部的EditText中窃取焦点吗?

1 个答案:

答案 0 :(得分:0)

找到解决方案

final PopupWindow popUp = new PopupWindow(vbl.getMainLayout());
....
popUp.setFocusable(true);
popUp.update();