web-dev-qa-db-fra.com

Obtenir un événement clé sur editext

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.

22
Flávio Faria

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);
}
71
Flávio Faria

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.

15
Reno

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);
    }
8
Rubin Yoo

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.

0
Micer