Saya punya situasi, di mana ada dua bidang. field1
dan field2
. Yang ingin saya lakukan adalah kosong field2
ketika field1
diubah dan sebaliknya. Jadi pada akhirnya hanya satu bidang yang memiliki konten di dalamnya.
field1 = (EditText)findViewById(R.id.field1);
field2 = (EditText)findViewById(R.id.field2);
field1.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) {
field2.setText("");
}
});
field2.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) {
field1.setText("");
}
});
Ia bekerja baik jika saya melampirkan addTextChangedListener
ke field1
saja, tetapi ketika saya melakukannya untuk kedua bidang aplikasi crash. Jelas karena mereka mencoba mengubah satu sama lain tanpa batas. Setelah field1
perubahan itu dihapus field2
pada saat
field2
ini diubah sehingga akan jelas field1
dan seterusnya ...
Adakah yang bisa menyarankan solusi?
starting waiting blocking gc alloc
jenis kesalahan ini, yang bahkan dapat menyebabkan crash dan hang .. jadi lanjutkan untuk pengikatan data, itu aman dan direkomendasikan oleh google sekarang ..Jawaban:
Anda bisa menambahkan tanda centang hanya untuk menghapus ketika teks di bidang tidak kosong (yaitu ketika panjangnya berbeda dari 0).
Dokumentasi untuk di
TextWatcher
sini .Harap juga hormati konvensi penamaan .
sumber
Saya tahu ini sudah tua tetapi seseorang mungkin menemukan ini lagi suatu hari nanti.
Saya memiliki masalah serupa di mana saya akan memanggil setText pada EditText dan onTextChanged akan dipanggil ketika saya tidak menginginkannya. Solusi pertama saya adalah menulis beberapa kode setelah memanggil setText () untuk membatalkan kerusakan yang dilakukan oleh pendengar. Tapi itu tidak terlalu elegan. Setelah melakukan beberapa penelitian dan pengujian saya menemukan bahwa menggunakan getText (). Clear () menghapus teks dengan cara yang sama seperti setText (""), tetapi karena tidak mengatur teks, pendengar tidak dipanggil, sehingga memecahkan masalah saya. Saya mengalihkan semua panggilan setText ("") saya ke getText (). Clear () dan saya tidak membutuhkan perban lagi, jadi mungkin itu akan menyelesaikan masalah Anda juga.
Coba ini:
sumber
Jika Anda menggunakan Kotlin untuk pengembangan Android maka Anda dapat menambahkan
TextChangedListener()
menggunakan kode ini:sumber
Agak terlambat dari jawaban, tetapi di sini ada solusi yang dapat digunakan kembali:
Jadi ketika hal di atas digunakan,
setText()
panggilan apa pun yang terjadi di dalam TextWatcher tidak akan mengakibatkan TextWatcher dipanggil lagi:sumber
Saya juga menghadapi masalah yang sama dan terus mendapatkan
stackOverflow
pengecualian, dan saya datang dengan solusi berikut.dideklarasikan awalnya boolean skipOnChange = false;
sumber
Anda juga dapat menggunakan metode hasFocus ():
Menguji ini untuk tugas kuliah yang sedang saya kerjakan untuk mengubah skala suhu saat pengguna mengetiknya. Bekerja dengan sempurna, dan itu jauh lebih sederhana.
sumber
periksa String sebelum mengeset yang lain
EditText
menjadi kosong. jikaField1
kosong maka mengapa perlu diubah lagi ke ("")? sehingga Anda dapat memeriksa ukuran String Anda dengan s.lenght () atau solusi lainCara lain yang dapat Anda periksa panjang String adalah:
sumber
Saya menulis ekstensi saya sendiri untuk ini, sangat membantu bagi saya. (Kotlin)
Anda hanya dapat menulis seperti itu:
Ekstensi saya:
sumber
dalam kode ini noteid pada dasarnya adalah argumen yang diambil kembali yang dimasukkan ke dalam indent atau melewati indent.
kode pada sisi negatifnya pada dasarnya adalah kode tambahan, jika Anda ingin memahami lebih jelas.
kode aktivitas baru bernama NoteEditor.java untuk tujuan pengeditan, aplikasi saya adalah basicley aplikasi catatan.
sumber
Di Kotlin cukup gunakan fungsi ekstensi KTX : (Menggunakan
TextWatcher
)impor
core-KTX
:sumber
Kami dapat menghapus TextWatcher untuk bidang sesaat sebelum mengedit teksnya lalu menambahkannya kembali setelah mengedit teks.
Nyatakan Pengamat Teks untuk field1 dan field2 sebagai variabel terpisah untuk memberi mereka nama: misalnya untuk field1
kemudian tambahkan pengamat menggunakan namanya:
field1.addTextChangedListener(Field_1_Watcher)
untuk field1 , danfield2.addTextChangedListener(Field_2_Watcher)
untuk field2Sebelum mengubah teks field2 hapus TextWatcher:
field2.removeTextChangedListener(Field_2_Watcher)
ubah teks:field2.setText("")
kemudian tambahkan kembali TextWatcher:
field2.addTextChangedListener(Field_2_Watcher)
Lakukan hal yang sama untuk bidang lainnya
sumber
Tambahkan latar belakang secara dinamis dalam
onCreate
metode:juga menghapus latar belakang dari XML.
sumber