Menghitung Karakter di EditText Berubah Pendengar

272

Dalam proyek saya, saya punya EditText. Saya ingin menghitung karakter dalam EditText, dan menunjukkan angka itu dalam a TextView. Saya telah menulis kode berikut dan berfungsi dengan baik. Namun, masalah saya adalah ketika saya Backspacemenghitungnya, tetapi saya harus mengurangi jumlahnya. Bagaimana saya bisa mempertimbangkan Backspace?

tv = (TextView)findViewById(R.id.charCounts);
textMessage = (EditText)findViewById(R.id.textMessage);
textMessage.addTextChangedListener(new TextWatcher(){
    public void afterTextChanged(Editable s) {
        i++;
        tv.setText(String.valueOf(i) + " / " + String.valueOf(charCounts));
    }
    public void beforeTextChanged(CharSequence s, int start, int count, int after){}
    public void onTextChanged(CharSequence s, int start, int before, int count){}
}); 
Hesam
sumber
36
Maafkan tidak relevan, tetapi saya ingin tahu bagaimana Anda menempatkan "backspace" dalam format pertanyaan Anda? Saya telah mengajukan pertanyaan serupa di mana teknik itu akan sangat berguna.
AlleyOOP
59
Tempatkan kata Anda (dalam hal ini Backspace) antara tag <kbd> </kbd> seperti: <kbd> Backspace </kbd>
Hesam
2
Setiap kali Anda melihat format yang menarik (seperti "backspace"), Anda selalu dapat mengklik tautan "edit" untuk melihat bagaimana penulis melakukannya. Kemudian cukup klik "batal" untuk membuang hasil edit Anda.
Suragch

Jawaban:

142

Menggunakan

s.length()

Berikut ini pernah disarankan dalam salah satu jawaban, tetapi sangat tidak efisien

textMessage.getText().toString().length()
xtempore
sumber
38

bagaimana dengan hanya mendapatkan panjang char di EditText Anda dan menampilkannya?

sesuatu di sepanjang garis

tv.setText(s.length() + " / " + String.valueOf(charCounts));
Andreas Wong
sumber
6
Ini bahkan lebih mudah dari itu - Anda bisa menelepon textMessage.length(), tidak perlu melakukan getText().toString(). developer.android.com/reference/android/widget/…
Yoni Samlan
28

sedikit perubahan dalam kode Anda:

TextView tv = (TextView)findViewById(R.id.charCounts);
textMessage = (EditText)findViewById(R.id.textMessage);
textMessage.addTextChangedListener(new TextWatcher(){
    public void afterTextChanged(Editable s) {
        tv.setText(String.valueOf(s.toString().length()));
    }
    public void beforeTextChanged(CharSequence s, int start, int count, int after){}
    public void onTextChanged(CharSequence s, int start, int before, int count){}
}); 
KKumar
sumber
1
Ini tidak akan berfungsi sebagai tulisan - length () mengembalikan int dan setText mengharapkan String
Martin Lockett
1
@ MartinLockett menggunakan Integer.toString (int_type) untuk mengubah string menjadi int.
Mehdi Rostami
6

Ini adalah jawaban yang sedikit lebih umum dengan lebih banyak penjelasan untuk pemirsa di masa depan.

Tambahkan pendengar yang diubah teks

Jika Anda ingin menemukan panjang teks atau melakukan hal lain setelah teks diubah, Anda dapat menambahkan pendengar yang diubah teks ke teks edit Anda.

EditText editText = (EditText) findViewById(R.id.testEditText);
editText.addTextChangedListener(new TextWatcher() {

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

    }

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

    }

    @Override
    public void afterTextChanged(Editable editable) {

    }
});

Pendengar membutuhkan TextWatcher, yang membutuhkan tiga metode untuk menjadi ditimpa: beforeTextChanged, onTextChanged, danafterTextChanged .

Menghitung karakter

Anda bisa mendapatkan jumlah karakter dalam onTextChangedatau beforeTextChangeddengan

charSequence.length()

atau afterTextChangeddengan

editable.length()

Arti metode

Parameternya sedikit membingungkan jadi inilah penjelasan tambahannya.

beforeTextChanged

beforeTextChanged(CharSequence charSequence, int start, int count, int after)

  • charSequence: Ini adalah konten teks sebelum perubahan yang tertunda dibuat. Anda seharusnya tidak mencoba mengubahnya.
  • start: Ini adalah indeks di mana teks baru akan dimasukkan. Jika rentang dipilih, maka itu adalah indeks awal rentang.
  • count: Ini adalah panjang teks yang dipilih yang akan diganti. Jika tidak ada yang dipilih maka countakan menjadi 0.
  • after: ini adalah panjang teks yang akan disisipkan.

onTextChanged

onTextChanged(CharSequence charSequence, int start, int before, int count)

  • charSequence: Ini adalah konten teks setelah perubahan dibuat. Anda sebaiknya tidak mencoba mengubah nilai ini di sini. Ubah editablein afterTextChangedjika Anda perlu.
  • start: Ini adalah indeks awal di mana teks baru dimasukkan.
  • before: Ini adalah nilai lama. Panjang teks yang dipilih sebelumnya yang diganti. Ini adalah nilai yang sama dengan countdi beforeTextChanged.
  • count: Ini adalah panjang teks yang disisipkan. Ini adalah nilai yang sama dengan afterdi beforeTextChanged.

afterTextChanged

afterTextChanged(Editable editable)

Seperti onTextChanged, ini dipanggil setelah perubahan telah dibuat. Namun, sekarang teks dapat dimodifikasi.

  • editable: Ini adalah teks yang dapat diedit dari EditText. Namun, jika Anda mengubahnya, Anda harus berhati-hati untuk tidak masuk ke loop tanpa batas. Lihat dokumentasi untuk lebih jelasnya.

Gambar tambahan dari jawaban ini

masukkan deskripsi gambar di sini

Suragch
sumber
0

TextWatcher maritalStatusTextWatcher = TextWatcher baru () {@Override public void beforeTextChanged (CharSequence charSequence, int i, int i1, int i2) {

    }

    @Override
    public void onTextChanged(CharSequence charSequence, int i, int i1, int i2) {
        try {
            if (charSequence.length()==0){
                topMaritalStatus.setVisibility(View.GONE);
            }else{
                topMaritalStatus.setVisibility(View.VISIBLE);
            }
        }catch (Exception e){
            e.printStackTrace();
        }
    }

    @Override
    public void afterTextChanged(Editable editable) {

    }
};
Chandan Bera
sumber