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

163

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

J'ai utilisé OnFocusChangeListenercomme ça

OnFocusChangeListener foco = new OnFocusChangeListener() {

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

    }
};

Mais ça ne marche pas pour moi.

japuentem
la source

Réponses:

344

Mettre en oeuvre onFocusChangede setOnFocusChangeListeneret il y a un paramètre booléen pour hasFocus. Lorsque cela est faux, vous avez perdu le focus sur 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
            }
        }
    });
ρяσѕρєя K
la source
20
+1 - mais il convient de noter que si votre texte d'édition est dans une vue de liste, chaque touche enfoncée entraînera la perte et le focus de la boîte. Voir cette solution pour garder une trace de la boîte actuellement focalisée: stackoverflow.com/questions/9527067/…
bsautner
Où dois-je ajouter le code que vous montrez? Si je le mets tel quel dans "onCreate", l'application plante
Jona
@ Léon Pelletier La vérité? Vraiment? L'utilisateur touche un autre contrôle focusable et le editText le perd. Je ne vois aucun problème. C'est la même chose si vous définissez le focus par votre code.
L'incroyable janvier
@Jona Vous pouvez l'ajouter n'importe où mais onCreate () fonctionne. S'il plante, vous faites quelque chose de mal.
L'incroyable janvier
8

Ayez votre Activityoutil OnFocusChangeListener()si vous souhaitez une utilisation factorisée de cette interface, exemple:

public class Shops extends AppCompatActivity implements View.OnFocusChangeListener{

Dans votre OnCreatevous pouvez ajouter un auditeur par exemple:

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

puis android studio vous demandera d'ajouter la méthode à partir 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) {
        editTextResearch.setText("");
        editTextMyWords.setText("");
        editTextPhone.setText("");
    }
    if (!hasFocus){
        editTextResearch.setText("BlaBlaBla");
        editTextMyWords.setText(" One Two Tree!");
        editTextPhone.setText("\"your phone here:\"");
    }
}

tout ce que vous codez dans le !hasFocusest pour le comportement de l'élément qui perd le focus, cela devrait faire l'affaire! Mais attention, dans un tel état, le changement de focus risque d'écraser les entrées de l'utilisateur!

Cerbère
la source
1
pourquoi ne pas simplement utiliser 'else' au lieu de '! hasFocus'
Salman Nazir
À l'époque, je voulais juste que les choses soient très claires, mais comme je l'ai dit, ce n'est pas utilisable car il est de toute façon ...
Cerberus
7

Voie Kotlin

editText.setOnFocusChangeListener { _, hasFocus ->
    if (!hasFocus) {  }
}
Achraf Amil
la source
1

Il fonctionne correctement

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

et_mobile.setOnFocusChangeListener(new OnFocusChangeListener() {          
    @Override
    public void onFocusChange(View v, boolean hasFocus) {
        if (!hasFocus) {
            // code to execute when EditText loses focus
            if (et_mobile.getText().toString().trim().length() == 0) {
                CommonMethod.showAlert("Please enter name", FeedbackSubmtActivity.this);
            }
        }
    }
});



public static void showAlert(String message, Activity context) {

    final AlertDialog.Builder builder = new AlertDialog.Builder(context);
    builder.setMessage(message).setCancelable(false)
            .setPositiveButton("OK", new DialogInterface.OnClickListener() {
                public void onClick(DialogInterface dialog, int id) {

                }
            });
    try {
        builder.show();
    } catch (Exception e) {
        e.printStackTrace();
    }

}
Keshav Gera
la source
0

Utilisation de l'expression lambda Java 8:

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