EditTextに入力しているときに戻るキーを押すイベントをどのように処理できますか?仮想キーボードが表示され、ユーザーが押し戻すと、非表示になります。このイベントを処理したいのですが、EditTextでOnKeyListenerを設定しても役に立ちません。
リノありがとうございます。それはおそらく動作するようですが、私はそれを別の方法で解決することができました。
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);
}
これは動作しません ?
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が出くわします。それが同様に機能することを願っています。
なぜこれが当てはまるのかはわかりませんが、カスタム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);
}
他の答えのどれも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回呼び出さないように注意してください。