Bagaimana saya bisa tahu ketika EditText kehilangan fokus?

162

Saya perlu menangkap ketika EditTextkehilangan fokus, saya telah mencari pertanyaan lain tetapi saya tidak menemukan jawaban.

Saya menggunakan OnFocusChangeListenerseperti ini

OnFocusChangeListener foco = new OnFocusChangeListener() {

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

    }
};

Tapi, itu tidak berhasil untukku.

japuentem
sumber

Jawaban:

343

Implement onFocusChangedari setOnFocusChangeListenerdan ada parameter boolean untuk hasFocus. Ketika ini salah, Anda kehilangan fokus ke kontrol lain.

 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
sumber
20
+1 - tetapi perlu dicatat bahwa jika teks edit Anda ada dalam tampilan daftar, setiap tombol turun akan menghasilkan kotak kehilangan dan mendapatkan fokus. Lihat solusi ini untuk melacak kotak yang saat ini difokuskan: stackoverflow.com/questions/9527067/…
bsautner
Di mana saya menambahkan kode yang Anda tampilkan? Jika saya memasukkannya seperti pada "onCreate" aplikasi macet
Jona
@ Léon Pelletier Yang benar? Betulkah? Pengguna menyentuh kontrol lain yang bisa fokus dan editText kehilangannya. Saya tidak bisa melihat masalah. Itu sama jika Anda mengatur fokus dengan kode Anda.
Jan
@ Joona Anda bisa menambahkannya di mana saja tetapi onCreate () berfungsi. Jika crash Anda melakukan sesuatu yang salah.
Luar biasa
8

Memiliki Anda Activitymenerapkan OnFocusChangeListener()jika Anda ingin menggunakan difaktorkan antarmuka ini, misalnya:

public class Shops extends AppCompatActivity implements View.OnFocusChangeListener{

Di Anda, OnCreateAnda dapat menambahkan pendengar misalnya:

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

maka android studio akan meminta Anda untuk menambahkan metode dari antarmuka, menerimanya ... itu akan seperti:

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

dan karena Anda memiliki kode faktor, Anda hanya perlu melakukannya:

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

apa pun yang Anda kode dalam !hasFocusadalah untuk perilaku item yang kehilangan fokus, yang seharusnya melakukan trik! Namun berhati-hatilah bahwa dalam kondisi seperti itu, perubahan fokus mungkin menimpa entri pengguna!

Cerberus
sumber
1
mengapa tidak hanya menggunakan 'yang lain' alih-alih '! hasFocus'
Salman Nazir
Pada saat itu, saya hanya ingin membuat semuanya menjadi sangat jelas, tetapi seperti yang saya katakan itu tidak dapat digunakan sebagaimana adanya ...
Cerberus
7

Jalan Kotlin

editText.setOnFocusChangeListener { _, hasFocus ->
    if (!hasFocus) {  }
}
Achraf Amil
sumber
1

Ini Bekerja Dengan Benar

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
sumber
0

Menggunakan ekspresi Java 8 lambda:

editText.setOnFocusChangeListener((v, hasFocus) -> {
    if(!hasFocus) {
        String value = String.valueOf( editText.getText() );
    }        
});
Sandeep Yohans
sumber