Comment puis-je gérer l'événement d'appuyer sur la touche Retour en tapant sur un editext? Lorsque le clavier virtuel est affiché et que l'utilisateur appuie en arrière, il est caché. Je veux gérer cet événement, mais la définition d'un surkeylistener dans l'editext n'aider pas.
Merci Reno. Cela semble probablement fonctionner, mais j'ai réussi à le résoudre différemment.
Je préconise l'Edittext OnKeyPeime (Stand Cockode, événement KeyEvent). Cette méthode intercepte les claviers sur l'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);
}
Cela ne fonctionne pas ?
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;
}
});
[~ # ~] Edit [~ # ~ ~]:
Bon cela est déprimant. Android N'envoie pas d'événements IME sur la fermeture du clavier QWERTY. C'est la seule solution de contournement que je rencontre. J'espère que cela fonctionne aussi.
Je n'ai aucune idée de la raison pour laquelle c'est le cas, mais que Onkeylistener fonctionne si vous pratiquez uniquement une version purement enkekey sur votre Custom Editext.
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);
}
Les autres réponses travaillaient pour moi dans SearchView
, je me suis enfin fini avec une méthode dispatchKeyEventPreIme(...)
dans ma vue personnalisée:
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
}
}
L'auditeur ressemble à ceci:
interface OnKeyEventPreImeListener {
fun onPreImeKeyEvent()
}
Et je l'énorme en fragment pour cacher ma recherche de recherche:
search_input.onKeyEventPreImeListener = object: OnKeyEventPreImeListener {
override fun onPreImeKeyEvent() {
hideSearchRow()
}
}
Notez que dispatchKeyEventPreIme(...)
méthode est appelée deux fois, assurez-vous de ne pas faire votre personnel à deux reprises.