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

use*_*927 5 android focus popup android-edittext

我有一个简单的“命令对话框”,它是一个包含 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>
Run Code Online (Sandbox Code Playgroud)

弹出式结构如下所示:

    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()
Run Code Online (Sandbox Code Playgroud)

似乎发生了竞争条件。我连接了一个硬件键盘,有两种方法可以打开弹出窗口:

  1. 我可以按下 Activity 注意到的 Enter 键,然后它调用函数来构造和显示弹出窗口。
  2. 我可以按下 UI 中的一个按钮,该按钮调用相同的函数。

每当我按下按钮打开弹出窗口时,EditText 都会获得焦点,每个人都很高兴。

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

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

我还需要弹出窗口是 externalTouchable,所以当你触摸它外面时它会消失。

我试过将 isTouchable 设置为 false,但似乎没有任何效果。

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

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

那唯一已经为我工作是设置一个计时器:

    android.os.Handler().postDelayed({ editText.requestFocus() }, 250)
Run Code Online (Sandbox Code Playgroud)

这确实有效,但显然是跛脚和脆弱的。

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

Raj*_*har -1

找到解决方案

final PopupWindow popUp = new PopupWindow(vbl.getMainLayout());
....
popUp.setFocusable(true);
popUp.update();
Run Code Online (Sandbox Code Playgroud)