我有一个简单的“命令对话框”,它是一个包含EditText和几个按钮的PopupWindow。我想要以下行为:
我的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()
似乎出现了竞争状况。我有一个附加的硬件键盘,有两种方法可以打开弹出窗口:
每当我按下按钮打开弹出窗口时,EditText就会得到焦点,每个人都很高兴。
每当我按下硬件键盘上的Enter键打开弹出窗口时,EditText会短暂获得焦点,然后变得没有焦点。我怀疑没有证据证明PopupWindow正在窃取焦点。
我需要弹出窗口是可聚焦的 - 否则按键只会转到Activity,在那里很难将它们路由回EditText。
我还需要弹出窗口可以在外面触摸,所以当你触摸外面时它会被忽略。
我已经尝试将isTouchable设置为false,但它似乎无论如何都没有效果。
我已经尝试过与此问题相关的各种古怪建议,例如调用popup.update()等等。没有什么能解决问题。
同样,当我通过按Enter键打开弹出窗口时,只发生 。我能看到的唯一区别是,在创建弹出窗口之前,Activity可能会暂时获得焦点,而如果我按下UI按钮打开弹出窗口,则Activity永远不会获得键盘焦点。但不确定。
唯一能为我工作的是设置一个计时器:
android.os.Handler().postDelayed({ editText.requestFocus() }, 250)
这就是诀窍,但显然是蹩脚和脆弱。
知道如何阻止我的弹出窗口从其内部的EditText中窃取焦点吗?
答案 0 :(得分:0)
找到解决方案
final PopupWindow popUp = new PopupWindow(vbl.getMainLayout());
....
popUp.setFocusable(true);
popUp.update();