Як я можу дізнатися, коли EditText втрачає фокус?


162

Мені потрібно піймати, коли EditTextвтрачається фокус, я шукав інші питання, але не знайшов відповіді.

Я використовував OnFocusChangeListenerтак

OnFocusChangeListener foco = new OnFocusChangeListener() {

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

    }
};

Але це не працює для мене.

Відповіді:


342

Реалізувати 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
            }
        }
    });

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

У той час я просто хотів зробити все зрозумілим, але, як я вже сказав, це не корисно, як це все одно ...
Cerberus


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() );
    }        
});
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.