Wie kann ich wissen, wann ein EditText den Fokus verliert?


162

Ich muss fangen, wenn ein EditTextFokus verliert, ich habe andere Fragen gesucht, aber keine Antwort gefunden.

Früher habe ich OnFocusChangeListenerwie folgt aus

OnFocusChangeListener foco = new OnFocusChangeListener() {

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

    }
};

Aber bei mir funktioniert es nicht.

Antworten:


342

Implementieren onFocusChangevon setOnFocusChangeListenerund es gibt einen booleschen Parameter für hasFocus. Wenn dies falsch ist, haben Sie den Fokus auf ein anderes Steuerelement verloren.

 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 - aber es ist erwähnenswert, dass, wenn sich Ihr Bearbeitungstext in einer Listenansicht befindet, jede Taste nach unten dazu führt, dass das Feld verliert und den Fokus erhält. Sehen Sie sich diese Lösung an, um die aktuell fokussierte Box im Auge
bsautner

Wo füge ich den angezeigten Code hinzu? Wenn ich es so setze wie es in "onCreate" ist, stürzt die App ab
Jona

@ Léon Pelletier Die Wahrheit? "Ja wirklich?" Der Benutzer berührt ein anderes fokussierbares Steuerelement und der editText verliert es. Ich kann kein Problem sehen. Es ist dasselbe, wenn Sie den Fokus durch Ihren Code festlegen.
Der unglaubliche

@Jona Sie können es überall hinzufügen, aber onCreate () funktioniert. Wenn es abstürzt, machen Sie etwas falsch.
Der unglaubliche

8

Lassen Sie Ihr ActivityGerät verwenden, OnFocusChangeListener()wenn Sie diese Schnittstelle faktorisiert verwenden möchten. Beispiel:

public class Shops extends AppCompatActivity implements View.OnFocusChangeListener{

In Ihrem OnCreatekönnen Sie beispielsweise einen Listener hinzufügen:

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

dann werden Sie von android studio aufgefordert, die Methode über die Benutzeroberfläche hinzuzufügen, zu akzeptieren ... es wird so aussehen:

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

und da Sie einen faktorisierten Code haben, müssen Sie nur Folgendes tun:

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

Alles, was Sie in codieren, !hasFocusist für das Verhalten des Elements, das den Fokus verliert, das sollte den Trick tun! Beachten Sie jedoch, dass in einem solchen Zustand die Änderung des Fokus die Einträge des Benutzers überschreiben kann!


1
Warum nicht einfach 'else' anstelle von '! hasFocus' verwenden
Salman Nazir

Zu der Zeit wollte ich nur die Dinge sehr klar machen, aber wie gesagt, es ist nicht verwendbar, wie es sowieso ist ...
Cerberus

7

Kotlin Weg

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

1

Es funktioniert richtig

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

Verwenden des Java 8-Lambda-Ausdrucks:

editText.setOnFocusChangeListener((v, hasFocus) -> {
    if(!hasFocus) {
        String value = String.valueOf( editText.getText() );
    }        
});
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.