W moim projekcie mam EditText
. Chcę policzyć znaki w EditText
i pokazać ten numer w TextView
. Napisałem następujący kod i działa dobrze. Jednak moim problemem jest to, że kiedy klikam Backspace, liczy się, ale muszę zmniejszyć liczbę. Jak mogę to 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){}
});
Odpowiedzi:
Posługiwać się
W jednej z odpowiedzi sugerowano kiedyś, że jest to bardzo nieefektywne
źródło
co powiesz na podanie długości znaku w edytorze i wyświetlenie go?
coś wzdłuż linii
źródło
textMessage.length()
, nie musisz tego robićgetText().toString()
. developer.android.com/reference/android/widget/…niewiele zmian w kodzie:
źródło
Jest to nieco bardziej ogólna odpowiedź, zawierająca więcej wyjaśnień dla przyszłych widzów.
Dodaj detektor ze zmienionym tekstem
Jeśli chcesz znaleźć długość tekstu lub zrobić coś innego po zmianie tekstu, możesz dodać do tekstu edycji detektora ze zmienionym tekstem.
Słuchacz potrzebuje
TextWatcher
, która wymaga trzech metod, aby zostać zastąpione:beforeTextChanged
,onTextChanged
, iafterTextChanged
.Liczenie postaci
Możesz uzyskać liczbę znaków w
onTextChanged
lubbeforeTextChanged
zlub
afterTextChanged
zZnaczenie metod
Parametry są nieco mylące, więc oto dodatkowe wyjaśnienie.
beforeTextChanged
beforeTextChanged(CharSequence charSequence, int start, int count, int after)
charSequence
: To jest treść tekstu przed dokonaniem oczekującej zmiany. Nie powinieneś próbować tego zmieniać.start
: Jest to indeks miejsca, w którym nowy tekst zostanie wstawiony. Jeśli zostanie wybrany zakres, będzie to indeks początkowy zakresu.count
: Jest to długość zaznaczonego tekstu, który zostanie zastąpiony. Jeśli nic nie zostanie wybrane,count
będzie0
.after
: jest to długość tekstu do wstawienia.onTextChanged
onTextChanged(CharSequence charSequence, int start, int before, int count)
charSequence
: To jest treść tekstu po wprowadzeniu zmiany. Nie powinieneś próbować modyfikować tej wartości tutaj. Modyfikacjaeditable
wafterTextChanged
jeśli trzeba.start
: Jest to indeks początku, od którego 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ść, cocount
wbeforeTextChanged
.count
: Jest to długość wstawionego tekstu. Jest to ta sama wartość, coafter
wbeforeTextChanged
.afterTextChanged
afterTextChanged(Editable editable)
Na przykład
onTextChanged
jest to wywoływane po dokonaniu zmiany. Jednak teraz tekst może zostać zmodyfikowany.editable
: To jest edytowalny tekst plikuEditText
. Jeśli jednak to zmienisz, musisz uważać, aby nie dostać się do nieskończonej pętli. Więcej informacji znajduje się w dokumentacji .Dodatkowy obraz z tej odpowiedzi
źródło
TextWatcher maritalStatusTextWatcher = new TextWatcher () {@Override public void beforeTextChanged (CharSequence charSequence, int i, int i1, int i2) {
źródło