Zliczanie znaków w nasłuchu zmienionym EditText

272

W moim projekcie mam EditText. Chcę policzyć znaki w EditTexti 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){}
}); 
Hesam
źródło
36
Proszę wybaczyć nieistotność, ale jestem ciekawy, jak umieściłeś „backspace” w formatowaniu pytania? Zadałem podobne pytania, w których ta technika byłaby bardzo przydatna.
AlleyOOP
59
Umieść swoje słowo (w tym przypadku Backspace) pomiędzy znacznikami <kbd> </kbd>, takimi jak: <kbd> Backspace </kbd>
Hesam
2
Ilekroć zobaczysz interesujące formatowanie (np. „Backspace”), zawsze możesz kliknąć link „edytuj”, aby zobaczyć, jak to zrobił autor. Następnie kliknij „Anuluj”, aby odrzucić swoją zmianę.
Suragch

Odpowiedzi:

142

Posługiwać się

s.length()

W jednej z odpowiedzi sugerowano kiedyś, że jest to bardzo nieefektywne

textMessage.getText().toString().length()
xtempore
źródło
38

co powiesz na podanie długości znaku w edytorze i wyświetlenie go?

coś wzdłuż linii

tv.setText(s.length() + " / " + String.valueOf(charCounts));
Andreas Wong
źródło
6
To jeszcze łatwiejsze - możesz po prostu zadzwonić textMessage.length(), nie musisz tego robić getText().toString(). developer.android.com/reference/android/widget/…
Yoni Samlan
28

niewiele zmian 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){}
}); 
KKumar
źródło
1
To nie zadziała, jak napisano - length () zwraca wartość int, a setText oczekuje ciągu
Martin Lockett
1
@MartinLockett użyj Integer.toString (int_type) do konwersji łańcucha na int.
Mehdi Rostami
6

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.

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 trzech metod, aby zostać zastąpione: beforeTextChanged, onTextChanged, i afterTextChanged.

Liczenie postaci

Możesz uzyskać liczbę znaków w onTextChangedlub beforeTextChangedz

charSequence.length()

lub afterTextChangedz

editable.length()

Znaczenie 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, countbędzie 0.
  • 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. Modyfikacja editablew afterTextChangedjeś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ść, co countw beforeTextChanged.
  • count: Jest to długość wstawionego tekstu. Jest to ta sama wartość, co afterw beforeTextChanged.

afterTextChanged

afterTextChanged(Editable editable)

Na przykład onTextChangedjest to wywoływane po dokonaniu zmiany. Jednak teraz tekst może zostać zmodyfikowany.

  • editable: To jest edytowalny tekst pliku EditText. 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

wprowadź opis zdjęcia tutaj

Suragch
źródło
0

TextWatcher maritalStatusTextWatcher = new TextWatcher () {@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
źródło