Подсчет символов в 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){}
}); 

36
Пожалуйста, простите за неуместность, но мне любопытно, как вы поместили «забой» в форматирование вашего вопроса? Я задавал похожие вопросы, где эта техника была бы очень полезна.
— AlleyOOP

59
Поместите ваше слово (в данном случае Backspace) между тегами <kbd> </ kbd>, такими как: <kbd> Backspace </ kbd>
— Hesam

2
Всякий раз, когда вы видите интересное форматирование (например, «возврат»), вы всегда можете нажать на ссылку «изменить», чтобы увидеть, как автор сделал это. Затем просто нажмите «Отмена», чтобы отменить изменения.
— Сурагч

Ответы:


142

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

s.length()

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

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

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

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. Если вы измените его, вы должны быть осторожны, чтобы не попасть в бесконечный цикл. Смотрите документацию для более подробной информации.

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

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


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

    }
};
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.