Skąd mogę wiedzieć, że EditText traci fokus?

162

Muszę złapać, gdy plik EditText traci koncentrację, szukałem innych pytań, ale nie znalazłem odpowiedzi.

Kiedyś OnFocusChangeListenertak

OnFocusChangeListener foco = new OnFocusChangeListener() {

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

    }
};

Ale to nie działa dla mnie.

japuentem
źródło

Odpowiedzi:

342

Wdrożenie onFocusChangeof setOnFocusChangeListenera tam logiczna parametrem hasFocus. Kiedy to jest fałszywe, straciłeś koncentrację na innej kontroli.

 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
źródło
20
+1 - ale warto zauważyć, że jeśli tekst edycji znajduje się w widoku listy, każdy naciśnięty klawisz spowoduje utratę pola i uzyskanie fokusu. Zobacz to rozwiązanie, aby śledzić
bieżące
Gdzie dodać kod, który pokazujesz? Jeśli wstawię to tak, jak w „onCreate”, aplikacja się zawiesza
Jona
@ Léon Pelletier Prawda? Naprawdę? Użytkownik dotyka innej kontrolki, na którą można ustawić fokus, a editText ją traci. Nie widzę żadnego problemu. Tak samo jest, jeśli ustawisz fokus za pomocą kodu.
Niesamowity
@Jona Możesz to dodać gdziekolwiek, ale onCreate () działa. Jeśli się zawiesza, robisz coś źle.
Niesamowity
8

Miej swoją Activityimplementację, OnFocusChangeListener()jeśli chcesz mieć faktoryzowane użycie tego interfejsu, na przykład:

public class Shops extends AppCompatActivity implements View.OnFocusChangeListener{

W swoim OnCreatemożesz dodać słuchacza na przykład:

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

następnie studio android poprosi Cię o dodanie metody z interfejsu, zaakceptuj ją ... będzie to wyglądać tak:

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

a ponieważ masz kod na czynniki, po prostu musisz to zrobić:

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

wszystko, co zakodujesz w !hasFocustekście, dotyczy zachowania elementu, który traci fokus, to powinno załatwić sprawę! Uważaj jednak, że w takim stanie zmiana punktu skupienia może nadpisać wpisy użytkownika!

Cerberus
źródło
1
dlaczego nie użyć po prostu „else” zamiast „! hasFocus”
Salman Nazir
W tamtym czasie chciałem tylko wyjaśnić sprawę, ale jak powiedziałem, nie nadaje się do użytku, tak czy inaczej ...
Cerberus
7

Droga Kotlina

editText.setOnFocusChangeListener { _, hasFocus ->
    if (!hasFocus) {  }
}
Achraf Amil
źródło
1

Działa poprawnie

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
źródło
0

Korzystanie z wyrażenia lambda Java 8:

editText.setOnFocusChangeListener((v, hasFocus) -> {
    if(!hasFocus) {
        String value = String.valueOf( editText.getText() );
    }        
});
Sandeep Yohans
źródło