android edittext onchange listener


116

Saya tahu sedikit tentang TextWatchertetapi itu berlaku pada setiap karakter yang Anda masukkan. Saya ingin pendengar yang aktif setiap kali pengguna selesai mengedit. Apa itu mungkin? Juga di TextWatchersaya mendapatkan contoh Editabletapi saya butuh contoh EditText. Bagaimana cara mendapatkannya?

EDIT : pertanyaan kedua lebih penting. Tolong jawab itu.


1
coba tambahkan pendengar fokus, ketika editText mengambil fokus, itu berarti pengguna sudah mulai mengeditnya, dan ketika editText kehilangan fokus, itu berarti pengeditan selesai
Houcine

Jawaban:


215

Pertama, Anda dapat melihat apakah pengguna selesai mengedit teks jika EditTextkehilangan fokus atau jika pengguna menekan tombol selesai (ini tergantung pada implementasi Anda dan apa yang paling cocok untuk Anda). Kedua, Anda tidak bisa mendapatkan EditTextinstance di dalam TextWatcheronly jika Anda telah mendeklarasikan EditTextsebagai objek instance. Padahal sebaiknya jangan di edit di EditTextdalamnya TextWatcherkarena tidak aman.

EDIT:

Untuk dapat memasukkan EditTextinstance ke dalam TextWatcherimplementasi Anda, Anda harus mencoba sesuatu seperti ini:

public class YourClass extends Activity {

    private EditText yourEditText;

    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);

        setContentView(R.layout.main);
        yourEditText = (EditText) findViewById(R.id.yourEditTextId);

        yourEditText.addTextChangedListener(new TextWatcher() {

            public void afterTextChanged(Editable s) {

                // you can call or do what you want with your EditText here

                // yourEditText... 
            }

            public void beforeTextChanged(CharSequence s, int start, int count, int after) {}

            public void onTextChanged(CharSequence s, int start, int before, int count) {}
        });
    }
}

Perhatikan bahwa sampel di atas mungkin memiliki beberapa kesalahan tetapi saya hanya ingin menunjukkan kepada Anda sebuah contoh.


18

Itu mengganggu saya bahwa menerapkan pendengar untuk semua bidang EditText saya mengharuskan saya memiliki kode verbose yang jelek jadi saya menulis kelas di bawah ini. Semoga bermanfaat bagi siapa saja yang tersandung pada hal ini.

public abstract class TextChangedListener<T> implements TextWatcher {
    private T target;

    public TextChangedListener(T target) {
        this.target = target;
    }

    @Override
    public void beforeTextChanged(CharSequence s, int start, int count, int after) {}

    @Override
    public void onTextChanged(CharSequence s, int start, int before, int count) {}

    @Override
    public void afterTextChanged(Editable s) {
        this.onTextChanged(target, s);
    }

    public abstract void onTextChanged(T target, Editable s);
}

Sekarang menerapkan pendengar sedikit lebih bersih.

editText.addTextChangedListener(new TextChangedListener<EditText>(editText) {
            @Override
            public void onTextChanged(EditText target, Editable s) {
                //Do stuff
            }
        });

Adapun seberapa sering itu diaktifkan, seseorang mungkin dapat mengimplementasikan pemeriksaan untuk menjalankan kode yang mereka inginkan //Do stuffsetelah diberikan a


Ini bekerja dengan sangat baik untuk saya, menghemat banyak baris kode! Kamu jenius!
huypham99

12

Siapapun yang menggunakan ButterKnife . Anda bisa menggunakan seperti:

@OnTextChanged(R.id.zip_code)
void onZipCodeTextChanged(CharSequence zipCode, int start, int count, int after) {

}

6

Saya telah melakukannya dengan menggunakan AutotextView:

AutotextView textView = (AutotextView) findViewById(R.id.autotextview);
textView.addTextChangedListener(new TextWatcher() {

    @Override
    public void onTextChanged(CharSequence cs, int arg1, int arg2, int arg3) {
        seq = cs;
    }

    @Override
    public void beforeTextChanged(CharSequence s, int arg1, int arg2, int arg3) {

    }

    @Override
    public void afterTextChanged(Editable arg0) {
        new SearchTask().execute(seq.toString().trim());
    }

});

3
 myTextBox.addTextChangedListener(new TextWatcher() {  

    public void afterTextChanged(Editable s) {}  

    public void beforeTextChanged(CharSequence s, int start, int count, int after) {} 

    public void onTextChanged(CharSequence s, int start, int before, int count) {  

    TextView myOutputBox = (TextView) findViewById(R.id.myOutputBox);  
    myOutputBox.setText(s);  

    }  
});  

2
Ada satu yang tidak perlu} di akhir
Howard

2

TextWatchertidak berhasil untuk saya karena terus menyerang untuk setiap EditTextdan mengacaukan nilai satu sama lain.

Inilah solusi saya:

public class ConsultantTSView extends Activity {
    .....

    //Submit is called when I push submit button.
    //I wanted to retrieve all EditText(tsHours) values in my HoursList

    public void submit(View view){

        ListView TSDateListView = (ListView) findViewById(R.id.hoursList);
        String value = ((EditText) TSDateListView.getChildAt(0).findViewById(R.id.tsHours)).getText().toString();
    }
}

Karenanya dengan menggunakan getChildAt(xx)metode ini Anda dapat mengambil item apa pun di ListViewdan mendapatkan item individu menggunakan findViewById. Dan itu akan memberikan nilai terbaru.


1

Sejauh yang saya bisa pikirkan, hanya ada dua cara Anda bisa melakukannya. Bagaimana Anda tahu bahwa pengguna telah selesai menulis kata? Bisa jadi fokus hilang, atau mengklik tombol "ok". Tidak mungkin di pikiran saya Anda bisa mengetahui pengguna menekan karakter terakhir ...

Jadi panggil onFocusChange(View v, boolean hasFocus)atau tambahkan tombol dan click listener untuk itu.


0

Metode Watcher mengaktifkan setiap input karakter. Jadi, saya membuat kode ini berdasarkan metode onFocusChange:

public static boolean comS(String s1,String s2){
    if (s1.length()==s2.length()){
        int l=s1.length();
        for (int i=0;i<l;i++){
            if (s1.charAt(i)!=s2.charAt(i))return false;
        }
        return true;
    }
    return false;
}

public void onChange(final EditText EdTe, final Runnable FRun){
    class finalS{String s="";}
    final finalS dat=new finalS();  
    EdTe.setOnFocusChangeListener(new OnFocusChangeListener() {          
        @Override
        public void onFocusChange(View v, boolean hasFocus) {
            if (hasFocus) {dat.s=""+EdTe.getText();}
            else if (!comS(dat.s,""+EdTe.getText())){(new Handler()).post(FRun);}       
        }
    });
}

Untuk menggunakannya, panggil saja seperti ini:

onChange(YourEditText, new Runnable(){public void run(){
    // V  V    YOUR WORK HERE

    }}
);

Anda dapat mengabaikan fungsi comS dengan mengganti! ComS (dat.s, "" + EdTe.getText ()) dengan fungsi! Equal. Namun fungsi yang sama itu sendiri kadang tidak bekerja dengan benar dalam waktu proses.

Pendengar onChange akan mengingat data lama EditText saat pengguna fokus mengetik, lalu membandingkan data baru tersebut saat pengguna kehilangan fokus atau beralih ke input lain. Jika membandingkan String lama bukan String baru yang sama, tindakan tersebut akan diaktifkan.

Jika Anda hanya memiliki 1 EditText, maka Anda perlu membuat fungsi ClearFocus dengan membuat EditText Mikro Transparan Rahasia Utama 😸 di luar jendela 😽 dan meminta fokus ke sana, lalu menyembunyikan keyboard melalui Manajer Metode Impor.

Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.