Como posso saber quando um EditText perde o foco?

162

Preciso capturar quando um EditTextfoco perde, procurei outras perguntas, mas não encontrei uma resposta.

Eu usei OnFocusChangeListenerassim

OnFocusChangeListener foco = new OnFocusChangeListener() {

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

    }
};

Mas, isso não funciona para mim.

japuentem
fonte

Respostas:

342

Implementar onFocusChangede setOnFocusChangeListenere há um parâmetro booleano para HasFocus. Quando isso é falso, você perdeu o foco para outro controle.

 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
            }
        }
    });
Coleção K
fonte
20
+1 - mas vale a pena notar que, se o seu texto de edição estiver em uma exibição de lista, cada tecla pressionada resultará na perda de caixa e na obtenção de foco. Veja esta solução para acompanhar a caixa atualmente focada: stackoverflow.com/questions/9527067/…
bsautner
Onde adiciono o código que você mostra? Se eu colocá-lo como está no "onCreate", o aplicativo trava
Jona
@ Léon Pelletier A verdade? Realmente? O usuário toca em outro controle focalizável e o editText o perde. Não vejo nenhum problema. É o mesmo se você definir o foco pelo seu código.
O incrível Jan
@ Jona Você pode adicioná-lo em qualquer lugar, mas onCreate () funciona. Se travar, você fará algo errado.
O incrível Jan
8

Tenha seu Activityimplemento OnFocusChangeListener()se você quiser um uso fatorado dessa interface, por exemplo:

public class Shops extends AppCompatActivity implements View.OnFocusChangeListener{

No seu OnCreatevocê pode adicionar um ouvinte, por exemplo:

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

o android studio solicitará que você adicione o método a partir da interface, aceite-o ... será como:

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

e como você possui um código fatorado, basta fazer o seguinte:

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

qualquer coisa que você codifique !hasFocusé para o comportamento do item que perde o foco, que deve fazer o truque! Mas lembre-se de que, nesse estado, a mudança de foco pode substituir as entradas do usuário!

Cerberus
fonte
1
por que não usar 'else' em vez de 'HasFocus!'
Salman Nazir
Na época, eu só queria fazer as coisas muito claras, mas como eu disse que não é utilizável como é de qualquer maneira ...
Cerberus
7

Kotlin way

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

Está funcionando corretamente

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

Usando a expressão lambda do Java 8:

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