Подсчет голосов в EditText Changed Listener

В моем проекте у меня есть EditText . Я хочу подсчитать символы в EditText и показать это число в TextView . Я написал следующий код, и он отлично работает. Тем не менее, моя проблема в том, что когда я нажимаю Backspace, он подсчитывает, но мне нужно уменьшить число. Как я могу рассмотреть 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){} }); 

    использование

     s.length() 

    В одном из ответов было предложено следующее, но его очень неэффективное

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

    Как насчет того, чтобы просто получить длину символа в вашем EditText и отобразить его?

    Что-то вдоль линии

     tv.setText(s.length() + " / " + String.valueOf(charCounts)); 

    Небольшое количество изменений в вашем коде:

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

    Это немного более общий ответ с дополнительными пояснениями для будущих зрителей.

    Добавить текст, измененный прослушиватель

    Если вы хотите найти длину текста или сделать что-то еще после изменения текста, вы можете добавить текстовый замеченный прослушиватель в текст редактирования.

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

    Слушателю нужен TextWatcher , который требует переопределения трех методов: beforeTextChanged , onTextChanged и afterTextChanged .

    Подсчет символов

    Вы можете получить количество символов в onTextChanged или beforeTextChanged с помощью

     charSequence.length() 

    Или в afterTextChanged с

     editable.length() 

    Значение методов

    Параметры немного запутывают, поэтому вот немного лишнее объяснение.

    beforeTextChanged

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

    • charSequence : это текстовое содержимое до charSequence ожидающего изменения. Вы не должны пытаться изменить его.
    • start : Это индекс, в который будет вставлен новый текст. Если выбран диапазон, то это начальный индекс диапазона.
    • count : Это длина выделенного текста, который будет заменен. Если ничего не выбрано, тогда count будет равен 0 .
    • after : это длина текста, который нужно вставить.

    OnTextChanged

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

    • charSequence : это текстовое содержимое после charSequence изменений. Вы не должны пытаться изменить это значение здесь. Измените editable в afterTextChanged если вам нужно.
    • start : Это индекс начала ввода нового текста.
    • before : Это старое значение. Это длина ранее выбранного текста, который был заменен. Это то же значение, что и count beforeTextChanged .
    • count : Это длина текста, который был вставлен. Это то же значение, что и в beforeTextChanged .

    afterTextChanged

    afterTextChanged(Editable editable)

    Подобно onTextChanged , это вызывается после того, как изменение уже выполнено. Однако теперь текст может быть изменен.

    • editable : Это редактируемый текст EditText . Если вы его измените, вы должны быть осторожны, чтобы не попасть в бесконечный цикл. Дополнительную информацию см. В документации .