Как я могу узнать, когда EditText теряет фокус?

163

Мне нужно ловить, когда EditTextтеряет фокус, я искал другие вопросы, но не нашел ответа.

Я использовал OnFocusChangeListenerкак это

OnFocusChangeListener foco = new OnFocusChangeListener() {

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

    }
};

Но это не работает для меня.

japuentem
источник

Ответы:

344

Реализовать onFocusChangeв setOnFocusChangeListenerи есть логический параметр для HasFocus. Когда это ложно, вы потеряли фокус на другой элемент управления.

 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
источник
20
+1 - но стоит заметить, что если ваш текст редактирования находится в виде списка, каждое нажатие клавиши приведет к потере поля и получению фокуса. Посмотрите это решение, чтобы отслеживать текущее окно: stackoverflow.com/questions/9527067/…
bsautner
Где я могу добавить код, который вы показываете? Если я поставлю его как есть в "onCreate", приложение вылетает
Jona
@ Леон Пеллетье Правда? В самом деле? Пользователь касается другого фокусируемого элемента управления, и editText теряет его. Я не вижу никаких проблем. То же самое, если вы установите фокус с помощью своего кода.
Невероятный Ян
@Jona Вы можете добавить его куда угодно, но onCreate () работает. Если он падает, вы делаете что-то не так.
Невероятный Ян
8

Если у вас есть факторизованное использование этого интерфейса, попросите Activityорудия OnFocusChangeListener(), например:

public class Shops extends AppCompatActivity implements View.OnFocusChangeListener{

В ваш OnCreateвы можете добавить слушателя, например:

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

Затем Android Studio предложит вам добавить метод из интерфейса, принять его ... это будет выглядеть так:

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

и поскольку у вас есть факторизованный код, вам просто нужно сделать это:

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

все, что вы кодируете в, !hasFocusпредназначено для поведения предмета, который потерял фокус, что должно сработать! Но учтите, что в таком состоянии смена фокуса может перезаписать записи пользователя!

Цербер
источник
1
почему бы просто не использовать «else» вместо «! hasFocus»
Salman Nazir
В то время я просто хотел прояснить ситуацию, но, как я уже сказал, это не годится для использования, так как это в любом случае ...
Цербер,
7

Котлин путь

editText.setOnFocusChangeListener { _, hasFocus ->
    if (!hasFocus) {  }
}
Ахраф Амил
источник
1

Работает правильно

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

Используя лямбда-выражение Java 8:

editText.setOnFocusChangeListener((v, hasFocus) -> {
    if(!hasFocus) {
        String value = String.valueOf( editText.getText() );
    }        
});
Сандип Йоханс
источник