web-dev-qa-db-ja.com

EditTextのキーイベントを取得する

EditTextに入力しているときに戻るキーを押すイベントをどのように処理できますか?仮想キーボードが表示され、ユーザーが押し戻すと、非表示になります。このイベントを処理したいのですが、EditTextでOnKeyListenerを設定しても役に立ちません。

22
Flávio Faria

リノありがとうございます。それはおそらく動作するようですが、私はそれを別の方法で解決することができました。

EditTextのonKeyPreIme(int keyCode、KeyEvent event)をオーバーライドしました。このメソッドは、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);
}
71
Flávio Faria

これは動作しません ?

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イベントを送信しません。 これが唯一の回避策です IVEが出くわします。それが同様に機能することを願っています。

15
Reno

なぜこれが当てはまるのかはわかりませんが、カスタム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);
    }
8
Rubin Yoo

他の答えのどれも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()
}
_

そして、フラグメントに設定して、検索行を非表示にします。

_search_input.onKeyEventPreImeListener = object: OnKeyEventPreImeListener {
    override fun onPreImeKeyEvent() {
        hideSearchRow()
    }
}
_

dispatchKeyEventPreIme(...)メソッドは2回呼び出されるため、イベントでスタッフを2回呼び出さないように注意してください。

0
Micer