Zählen von Zeichen in EditText Geänderter Listener

272

In meinem Projekt habe ich eine EditText. Ich möchte die Zeichen in der zählen EditTextund diese Nummer in a zeigen TextView. Ich habe den folgenden Code geschrieben und es funktioniert gut. Mein Problem ist jedoch, wenn ich darauf klicke, dass Backspacees zählt, aber ich muss die Anzahl verringern. Wie kann ich berücksichtigen 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
quelle
36
Bitte verzeihen Sie die Irrelevanz, aber ich bin gespannt, wie Sie die "Rücktaste" in Ihre Fragenformatierung eingefügt haben. Ich habe ähnliche Fragen gestellt, bei denen diese Technik sehr nützlich gewesen wäre.
AlleyOOP
59
Platzieren Sie Ihr Wort (in diesem Fall Rücktaste) zwischen <kbd> </ kbd> -Tags wie: <kbd> Rücktaste </ kbd>
Hesam
2
Wenn Sie interessante Formatierungen sehen (wie "Rücktaste"), können Sie jederzeit auf den Link "Bearbeiten" klicken, um zu sehen, wie der Autor dies getan hat. Klicken Sie dann einfach auf "Abbrechen", um Ihre Bearbeitung zu verwerfen.
Suragch

Antworten:

142

Verwenden

s.length()

Das Folgende wurde einmal in einer der Antworten vorgeschlagen, aber es ist sehr ineffizient

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

Wie wäre es, wenn Sie nur die Länge des Zeichens in Ihrem EditText abrufen und anzeigen?

etwas in der Richtung von

tv.setText(s.length() + " / " + String.valueOf(charCounts));
Andreas Wong
quelle
6
Es ist noch einfacher als das - Sie können einfach anrufen textMessage.length(), ohne es zu tun getText().toString(). developer.android.com/reference/android/widget/…
Yoni Samlan
28

kleine Änderungen in Ihrem Code:

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
quelle
1
Dies funktioniert nicht wie geschrieben - length () gibt ein int zurück und setText erwartet einen String
Martin Lockett
1
@MartinLockett verwendet Integer.toString (int_type), um einen String in int zu konvertieren.
Mehdi Rostami
6

Dies ist eine etwas allgemeinere Antwort mit mehr Erklärung für zukünftige Zuschauer.

Fügen Sie einen Text-geänderten Listener hinzu

Wenn Sie die Textlänge ermitteln oder etwas anderes tun möchten, nachdem der Text geändert wurde, können Sie Ihrem Bearbeitungstext einen Listener für Textänderungen hinzufügen.

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

    }
});

Der Hörer muss ein TextWatcher, die drei Methoden erfordert wird außer Kraft gesetzt: beforeTextChanged, onTextChanged, und afterTextChanged.

Die Zeichen zählen

Sie können die Anzahl der Zeichen in onTextChangedoder beforeTextChangedmit erhalten

charSequence.length()

oder in afterTextChangedmit

editable.length()

Bedeutung der Methoden

Die Parameter sind etwas verwirrend, daher hier eine zusätzliche Erklärung.

beforeTextChanged

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

  • charSequence: Dies ist der Textinhalt, bevor die ausstehende Änderung vorgenommen wird. Sie sollten nicht versuchen, es zu ändern.
  • start: Dies ist der Index, in den der neue Text eingefügt wird. Wenn ein Bereich ausgewählt ist, ist dies der Anfangsindex des Bereichs.
  • count: Dies ist die Länge des ausgewählten Textes, der ersetzt werden soll. Wenn nichts ausgewählt ist, countwird 0.
  • after: Dies ist die Länge des einzufügenden Textes.

onTextChanged

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

  • charSequence: Dies ist der Textinhalt nach der Änderung. Sie sollten hier nicht versuchen, diesen Wert zu ändern. Ändern Sie das editableIn, afterTextChangedfalls erforderlich.
  • start: Dies ist der Index des Anfangs, an dem der neue Text eingefügt wurde.
  • before: Dies ist der alte Wert. Dies ist die Länge des zuvor ausgewählten Texts, der ersetzt wurde. Dies ist der gleiche Wert wie countin beforeTextChanged.
  • count: Dies ist die Länge des eingefügten Textes. Dies ist der gleiche Wert wie afterin beforeTextChanged.

afterTextChanged

afterTextChanged(Editable editable)

Wie onTextChangeddiese aufgerufen wird , nachdem die Änderung bereits vorgenommen wurde. Jetzt kann der Text jedoch geändert werden.

  • editable: Dies ist der bearbeitbare Text des EditText. Wenn Sie es jedoch ändern, müssen Sie darauf achten, nicht in eine Endlosschleife zu geraten. Weitere Informationen finden Sie in der Dokumentation .

Ergänzendes Bild von dieser Antwort

Geben Sie hier die Bildbeschreibung ein

Suragch
quelle
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
quelle