Liczenie znaków w EditText zmieniło słuchacza

W moim projekcie mam EditText. Chcę policzyć znaki w EditText i pokazać tę liczbę w TextView. Napisałem następujący kod i działa dobrze. Jednak mój problem polega na tym, że gdy klikam Backspace liczy się, ale muszę zmniejszyć liczbę. Jak mogę rozważyć 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){}
}); 
Author: Jared Rummler, 2010-11-30

4 answers

Użyj

s.length()

Następujące zostało kiedyś zasugerowane w jednej z odpowiedzi, ale jest bardzo nieefektywne

textMessage.getText().toString().length()
 140
Author: xtempore,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2014-12-19 16:19:19

Może po prostu pobranie długości znaku w edytorze i wyświetlenie go?

Coś wzdłuż linii

tv.setText(s.length() + " / " + String.valueOf(charCounts));
 38
Author: Andreas Wong,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2012-04-02 09:04:52

Małe zmiany w kodzie:

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){}
}); 
 27
Author: KKumar,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2016-06-14 19:15:53

Jest to nieco bardziej ogólna odpowiedź z więcej wyjaśnień dla przyszłych widzów.

Dodaj tekst zmieniony słuchacz

Jeśli chcesz znaleźć długość tekstu lub zrobić coś innego po zmianie tekstu, możesz dodać tekst zmieniony słuchaczem do edycji tekstu.

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

    }
});

Słuchacz potrzebuje TextWatcher, która wymaga nadpisania trzech metod: beforeTextChanged, onTextChanged, i afterTextChanged.

Liczenie znaków

Można uzyskać postać policz w onTextChanged lub beforeTextChanged z

charSequence.length()

Lub w afterTextChanged z

editable.length()

Znaczenie metod

Parametry są trochę mylące, więc tutaj jest trochę dodatkowe wyjaśnienie.

BeforeTextChanged

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

  • charSequence: jest to zawartość tekstowa przed dokonaniem oczekującej zmiany. Nie powinieneś próbować tego zmieniać.
  • start: jest to indeks miejsca, w którym zostanie wstawiony nowy tekst. Jeśli zaznaczony jest zakres, to jest indeksem początku zakresu.
  • count: jest to długość zaznaczonego tekstu, który ma zostać zastąpiony. Jeśli nic nie jest zaznaczone, to {[13] } będzie 0.
  • after: jest to długość tekstu do wstawienia.

OnTextChanged

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

  • charSequence: jest to zawartość tekstowa po wprowadzeniu zmiany. Nie należy próbować modyfikować tej wartości tutaj. Zmodyfikuj editable w afterTextChanged jeśli potrzebujesz za.
  • start: jest to indeks początku, w którym wstawiono nowy tekst.
  • before: to jest stara wartość. Jest to długość wcześniej zaznaczonego tekstu, który został zastąpiony. Jest to ta sama wartość co count W beforeTextChanged.
  • count: jest to długość tekstu, który został wstawiony. Jest to ta sama wartość co after W beforeTextChanged.

AfterTextChanged

afterTextChanged(Editable editable)

Podobnie jak onTextChanged, nazywa się to po zmianie już made. Jednak teraz tekst może zostać zmodyfikowany.

  • editable: jest to edytowalny tekst EditText. Jeśli jednak go zmienisz, musisz uważać, aby nie dostać się do nieskończonej pętli. Więcej informacji można znaleźć w dokumentacji .

Zdjęcie uzupełniające z ta odpowiedź

Tutaj wpisz opis obrazka

 3
Author: Suragch,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-11-29 14:25:04