在EditText上获取关键事件

时间:2011-02-25 03:57:11

标签: android listener android-edittext

如何在EditText上键入时按下后退键的事件?当显示虚拟键盘并且用户按下时,它将被隐藏。我想处理这个事件,但在EditText中设置OnKeyListener没有用。

4 个答案:

答案 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(...)方法被调用了两次,因此请确保您也不对事件进行两次操作。