EditText Değişen Dinleyicideki Karakterleri Sayma


272

Projemde bir EditText. 'Deki karakterleri saymak EditTextve bu sayıyı a' da göstermek istiyorum TextView. Aşağıdaki kodu yazdım ve iyi çalışıyor. Ancak, benim sorunum tıkladığında Backspacesayılır, ancak sayıyı azaltmam gerekiyor. Nasıl düşünebilirim 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){}
}); 

36
Lütfen ilgisizliği affedin, ancak "backspace" i soru biçimlendirmenize nasıl yerleştirdiğinizi merak ediyorum. Bu tekniğin çok faydalı olacağı benzer sorular sordum.
AlleyOOP

59
Sözcüğünüzü (bu örnekte Backspace) <kbd> </kbd> etiketleri arasına yerleştirin: <kbd> Backspace </kbd>
Hesam

2
İlginç bir biçimlendirme gördüğünüzde ("geri al" gibi), yazarın nasıl yaptığını görmek için her zaman "düzenle" bağlantısını tıklayabilirsiniz. Ardından, düzenlemenizi silmek için "iptal et" i tıklamanız yeterlidir.
Suragch

Yanıtlar:


142

kullanım

s.length()

Bir zamanlar cevaplardan birinde önerildi, ancak çok verimsiz

textMessage.getText().toString().length()


28

kodunuzda biraz değişiklik:

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){}
}); 

1
Yazılı olarak çalışmaz - length () bir int döndürür ve setText bir String bekler
Martin Lockett

1
@MartinLockett, string'i int'e dönüştürmek için Integer.toString (int_type) kullanır.
Mehdi Rostami

6

Bu, gelecekteki izleyiciler için daha fazla açıklama ile biraz daha genel bir cevaptır.

Metin değiştirilmiş dinleyici ekle

Metin uzunluğunu bulmak veya metin değiştirildikten sonra başka bir şey yapmak istiyorsanız, düzenleme metninize metin değiştirilmiş dinleyici ekleyebilirsiniz.

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) {

    }
});

Dinleyici ihtiyacı TextWatcher: geçersiz kılınan olmak üç yöntem gerektirir, beforeTextChanged, onTextChanged, ve afterTextChanged.

Karakterleri sayma

Karakter sayısını içeri onTextChangedveya beforeTextChangediçine alabilirsiniz

charSequence.length()

veya afterTextChangedile

editable.length()

Yöntemlerin anlamı

Parametreler biraz kafa karıştırıcı, bu yüzden burada biraz ekstra açıklama var.

beforeTextChanged

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

  • charSequence: Bu, bekleyen değişiklik yapılmadan önceki metin içeriğidir. Değiştirmeye çalışmamalısınız.
  • start: Bu, yeni metnin ekleneceği dizindir. Bir aralık seçilirse, aralığın başlangıç ​​dizinidir.
  • count: Bu, değiştirilecek seçilen metnin uzunluğudur. Hiçbir şey seçilirse o zaman countolacak 0.
  • after: bu, eklenecek metnin uzunluğudur.

OnTextChanged

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

  • charSequence: Bu, değişiklik yapıldıktan sonraki metin içeriğidir. Bu değeri burada değiştirmeye çalışmamalısınız. Değiştir editableiçinde afterTextChangedGerekirse.
  • start: Bu, yeni metnin eklendiği başlangıcın dizinidir.
  • before: Bu eski değer. Değiştirilen, önceden seçilen metnin uzunluğudur. Bu aynı değerdir countiçinde beforeTextChanged.
  • count: Bu, eklenen metnin uzunluğudur. Bu aynı değerdir afteriçinde beforeTextChanged.

afterTextChanged

afterTextChanged(Editable editable)

Gibi onTextChangeddeğişiklik zaten yapıldıktan sonra, bu denir. Ancak, şimdi metin değiştirilebilir.

  • editable: Bu, düzenlenebilir metnidir EditText. Eğer değiştirirseniz, sonsuz bir döngüye girmemeye dikkat etmelisiniz. Daha fazla ayrıntı için belgelere bakın.

Bu cevaptan ek görüntü

resim açıklamasını buraya girin


0

TextWatcher maritalStatusTextWatcher = new TextWatcher () {@Geniş boşluktan önce geçersiz kılTextChanged (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) {

    }
};
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.