Подсчет символов в EditText Измененный слушатель

272

В моем проекте у меня есть 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){}
}); 
Hesam
источник
36
Пожалуйста, простите за неуместность, но мне любопытно, как вы поместили «забой» в форматирование вашего вопроса? Я задавал похожие вопросы, где эта техника была бы очень полезна.
AlleyOOP
59
Поместите ваше слово (в данном случае Backspace) между тегами <kbd> </ kbd>, такими как: <kbd> Backspace </ kbd>
Hesam
2
Всякий раз, когда вы видите интересное форматирование (например, «возврат»), вы всегда можете нажать на ссылку «изменить», чтобы увидеть, как автор сделал это. Затем просто нажмите «Отмена», чтобы отменить изменения.
Сурагч

Ответы:

142

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

s.length()

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

textMessage.getText().toString().length()
xtempore
источник
38

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

что-то по линии

tv.setText(s.length() + " / " + String.valueOf(charCounts));
Андреас Вонг
источник
6
Это даже проще, чем это - вы можете просто позвонить textMessage.length(), не нужно делать getText().toString(). developer.android.com/reference/android/widget/...
Йони Samlan
28

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

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
источник
1
Это не будет работать как написано - length () возвращает int, а setText ожидает строку
Martin Lockett
1
@MartinLockett использует Integer.toString (int_type) для преобразования строки в int.
Мехди Ростами
6

Это немного более общий ответ с большим количеством объяснений для будущих зрителей.

Добавить текст измененного слушателя

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

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: Это текстовое содержимое до внесения ожидающих изменений. Вы не должны пытаться изменить это.
  • start: Это индекс того, где новый текст будет вставлен. Если диапазон выбран, то это начальный индекс диапазона.
  • count: Это длина выделенного текста, который будет заменен. Если ничего не выбрано, то countбудет0 .
  • after: это длина текста для вставки.

OnTextChanged

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

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

afterTextChanged

afterTextChanged(Editable editable)

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

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

Дополнительное изображение из этого ответа

введите описание изображения здесь

Suragch
источник
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) {

    }
};
Чандан Бера
источник