如何在EditText上键入时按下后退键的事件?当显示虚拟键盘并且用户按下时,它将被隐藏。我想处理这个事件,但在EditText中设置OnKeyListener没有用。
答案 0 :(得分:69)
谢谢Reno。它似乎可行,但我设法以不同的方式解决它。
我覆盖了EditText的onKeyPreIme(int keyCode,KeyEvent事件)。此方法拦截IME上的按键。 = d
public boolean onKeyPreIme(int keyCode, KeyEvent event) {
if (keyCode == KeyEvent.KEYCODE_BACK &&
event.getAction() == KeyEvent.ACTION_UP) {
// do your stuff
return false;
}
return super.dispatchKeyEvent(event);
}
答案 1 :(得分:15)
这不起作用?
edText.setOnKeyListener(new OnKeyListener()
{
public boolean onKey(View v, int keyCode, KeyEvent event)
{
if (event.getAction() == KeyEvent.ACTION_DOWN)
{
//check if the right key was pressed
if (keyCode == KeyEvent.KEYCODE_BACK)
{
return true;
}
}
return false;
}
});
编辑:
好吧这令人沮丧。 Android在关闭qwerty键盘时不发送IME事件。我遇到的This is the only workaround。我希望它也适合你。
答案 2 :(得分:7)
我不知道为什么会出现这种情况,但如果您只是纯粹覆盖自定义EditText上的onKeyPreIme,则OnKeyListener可以正常工作。
customEditText.setOnKeyListener((v, keyCode, event) -> {
if(event.getAction() == KeyEvent.ACTION_DOWN) {
switch (keyCode) {
case KeyEvent.KEYCODE_BACK:
getPresenter().onBackPressed();
break;
}
}
return false;
});
@Override
public boolean onKeyPreIme(int keyCode, KeyEvent event) {
return super.dispatchKeyEvent(event);
}
答案 3 :(得分:0)
在SearchView
中没有其他答案对我有用,我终于在自定义视图中最终覆盖了dispatchKeyEventPreIme(...)
方法:
class ImeAwareSearchView @JvmOverloads constructor(
context: Context?,
attrs: AttributeSet? = null,
defStyleAttr: Int = 0
) : SearchView(context, attrs, defStyleAttr) {
var onKeyEventPreImeListener: OnKeyEventPreImeListener? = null
override fun dispatchKeyEventPreIme(event: KeyEvent?): Boolean {
onKeyEventPreImeListener?.onPreImeKeyEvent()
return false
}
}
收听者如下:
interface OnKeyEventPreImeListener {
fun onPreImeKeyEvent()
}
我在Fragment中设置它以隐藏搜索行:
search_input.onKeyEventPreImeListener = object: OnKeyEventPreImeListener {
override fun onPreImeKeyEvent() {
hideSearchRow()
}
}
请注意,dispatchKeyEventPreIme(...)
方法被调用了两次,因此请确保您也不对事件进行两次操作。