181 votes

Comment puis-je savoir quand un EditText perd le focus ?

J'ai besoin d'attraper quand un EditText loses focus, j'ai cherché d'autres questions mais je n'ai pas trouvé de réponse.

J'ai utilisé OnFocusChangeListener comme ceci

OnFocusChangeListener foco = new OnFocusChangeListener() {

    @Override
    public void onFocusChange(View v, boolean hasFocus) {
        // TODO Auto-generated method stub

    }
};

Mais, ça ne marche pas pour moi.

384voto

ρяσѕρєя K Points 51253

Mettre en œuvre onFocusChange de setOnFocusChangeListener et il y a un paramètre booléen pour hasFocus. Lorsque ce paramètre est faux, vous avez perdu le focus au profit d'un autre contrôle.

 EditText txtEdit = (EditText) findViewById(R.id.edittxt);

 txtEdit.setOnFocusChangeListener(new OnFocusChangeListener() {          
        @Override
        public void onFocusChange(View v, boolean hasFocus) {
            if (!hasFocus) {
               // code to execute when EditText loses focus
            }
        }
    });

22 votes

+1 - mais il faut noter que si votre texte d'édition est dans une liste, chaque touche enfoncée aura pour résultat que la boîte perdra et récupérera le focus. Voir cette solution pour garder la trace de la boîte actuellement focalisée : stackoverflow.com/questions/9527067/

0 votes

Où dois-je ajouter le code que vous montrez ? Si je le mets tel quel dans "onCreate", l'application se plante.

0 votes

@Léon Pelletier La vérité ? Vraiment ? L'utilisateur touche un autre contrôle focalisable et l'editText le perd. Je ne vois pas de problème. C'est la même chose si vous définissez le focus par votre code.

10voto

StenaviN Points 2781
editText.setOnFocusChangeListener(new OnFocusChangeListener() {
    @Override
    public void onFocusChange(View v, boolean hasFocus) {
        // TODO Auto-generated method stub

    }
});

10voto

Cerberus Points 121

Ayez votre Activity mettre en œuvre OnFocusChangeListener() si vous voulez une utilisation factorisée de cette interface, par exemple :

public class Shops extends AppCompatActivity implements View.OnFocusChangeListener{

Dans votre OnCreate vous pouvez ajouter un écouteur, par exemple :

editTextResearch.setOnFocusChangeListener(this);
editTextMyWords.setOnFocusChangeListener(this);
editTextPhone.setOnFocusChangeListener(this);

alors Android studio vous demandera d'ajouter la méthode de l'interface, acceptez-la... ce sera comme :

@Override
public void onFocusChange(View v, boolean hasFocus) {
  // todo your code here...
}

et comme vous avez un code factorisé, vous n'aurez qu'à le faire :

@Override
public void onFocusChange(View v, boolean hasFocus) {
  if (!hasFocus){
    doSomethingWith(editTextResearch.getText(),
      editTextMyWords.getText(),
      editTextPhone.getText());
  }
}

Cela devrait faire l'affaire !

2 votes

Pourquoi ne pas simplement utiliser "else" au lieu de "hasFocus" ?

0 votes

A l'époque, je voulais juste que les choses soient très claires, mais comme je l'ai dit, ce n'est pas utilisable tel quel de toute façon...

9voto

Achraf Amil Points 321

La méthode Kotlin

editText.setOnFocusChangeListener { _, hasFocus ->
    if (!hasFocus) {  }
}

2voto

Sandeep Yohans Points 479

Utilisation de l'expression lambda de Java 8 :

editText.setOnFocusChangeListener((v, hasFocus) -> {
    if(!hasFocus) {
        String value = String.valueOf( editText.getText() );
    }        
});

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X