¿Cómo puedo saber cuando un EditText pierde el foco?

162

Necesito detectar cuando EditTextpierde el foco, busqué otras preguntas pero no encontré una respuesta.

Solia OnFocusChangeListenerasi

OnFocusChangeListener foco = new OnFocusChangeListener() {

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

    }
};

Pero no me funciona.

japuentem
fuente

Respuestas:

343

Implementar onFocusChangede setOnFocusChangeListenery hay un parámetro booleano para hasFocus. Cuando esto es falso, has perdido el foco a otro control.

 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
fuente
20
+1, pero vale la pena señalar que si su texto de edición está en una vista de lista, cada tecla presionada hará que el cuadro se pierda y se enfoque. Vea esta solución para realizar un seguimiento del cuadro actualmente enfocado: stackoverflow.com/questions/9527067/…
bsautner
¿Dónde agrego el código que muestra? Si lo pongo como está en "onCreate", la aplicación se bloquea
Jona
@ Léon Pelletier La verdad? De Verdad? El usuario toca otro control enfocable y editText lo pierde. No veo ningún problema Es lo mismo si establece el foco por su código.
El increíble enero
@Jona Puede agregarlo en cualquier lugar, pero onCreate () funciona. Si se bloquea, haces algo mal.
El increíble enero
8

Tenga su Activityimplemento OnFocusChangeListener()si desea un uso factorizado de esta interfaz, por ejemplo:

public class Shops extends AppCompatActivity implements View.OnFocusChangeListener{

En su OnCreatepuede agregar un oyente, por ejemplo:

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

entonces Android Studio le pedirá que agregue el método desde la interfaz, acéptelo ... será como:

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

y como tienes un código factorizado, solo tendrás que hacer eso:

@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:\"");
    }
}

todo lo que codifiques !hasFocuses para el comportamiento del elemento que pierde el foco, ¡eso debería ser el truco! ¡Pero tenga en cuenta que en ese estado, el cambio de enfoque podría sobrescribir las entradas del usuario!

Cerbero
fuente
1
¿Por qué no usar 'else' en lugar de '! hasFocus'
Salman Nazir
En ese momento, solo quería dejar las cosas muy claras, pero como dije no es utilizable, ya que de todos modos es ...
Cerberus
7

Camino Kotlin

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

Está funcionando correctamente

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
fuente
0

Usando Java 8 expresión lambda:

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