Come posso sapere quando un EditText perde attenzione?


162

Ho bisogno di catturare quando EditTextperde la concentrazione, ho cercato altre domande ma non ho trovato una risposta.

L'ho usato OnFocusChangeListenercosì

OnFocusChangeListener foco = new OnFocusChangeListener() {

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

    }
};

Ma non funziona per me.

Risposte:


343

Implementare onFocusChangedi setOnFocusChangeListenere c'è un parametro booleano per hasFocus. Quando questo è falso, hai perso la concentrazione su un altro controllo.

 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
            }
        }
    });

20
+1 - ma vale la pena notare che se il testo di modifica è in una visualizzazione elenco, ogni tasto in giù comporterà la perdita della casella e la messa a fuoco. Vedere questa soluzione per tenere traccia della scatola attualmente concentrata: stackoverflow.com/questions/9527067/...
bsautner

Dove posso aggiungere il codice che mostri? Se lo metto com'è in "onCreate", l'app si blocca
Jona il

@ Léon Pelletier La verità? Veramente? L'utente tocca un altro controllo attivabile e editText lo perde. Non riesco a vedere alcun problema. È lo stesso se imposti il ​​focus sul tuo codice.
L'incredibile

@Jona Potresti aggiungerlo ovunque ma onCreate () funziona. Se si blocca, fai qualcosa di sbagliato.
L'incredibile

8

Avere il proprio Activityattrezzo OnFocusChangeListener()se si desidera un uso fattivo di questa interfaccia, ad esempio:

public class Shops extends AppCompatActivity implements View.OnFocusChangeListener{

Nel tuo OnCreatepuoi aggiungere un ascoltatore per esempio:

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

quindi Android Studio ti chiederà di aggiungere il metodo dall'interfaccia, accettarlo ... sarà come:

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

e dato che hai un codice fattorizzato, dovrai solo farlo:

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

tutto ciò che codifichi !hasFocusè per il comportamento dell'oggetto che perde attenzione, che dovrebbe fare il trucco! Ma attenzione che in tale stato, il cambio di messa a fuoco potrebbe sovrascrivere le voci dell'utente!


1
perché non usare semplicemente 'else' invece di '! hasFocus'
Salman Nazir

All'epoca, volevo solo chiarire le cose, ma come ho detto non è utilizzabile come lo è comunque ...
Cerberus,

7

Modo di Kotlin

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

1

Funziona correttamente

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();
    }

}

0

Utilizzando l'espressione lambda di Java 8:

editText.setOnFocusChangeListener((v, hasFocus) -> {
    if(!hasFocus) {
        String value = String.valueOf( editText.getText() );
    }        
});
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.