Подсчет символов в прослушивателе EditText Changed

В моем проекте есть 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){}
}); 

person Hesam    schedule 30.11.2010    source источник
comment
Пожалуйста, простите за нерелевантность, но мне любопытно, как вы поместили обратное пространство в форматирование своего вопроса? Я задавал аналогичные вопросы, когда этот метод был бы очень полезен.   -  person AlleyOOP    schedule 05.01.2014
comment
Поместите свое слово (в данном случае Backspace) между тегами ‹kbd› ‹/kbd›, например: ‹kbd› Backspace ‹/kbd›   -  person Hesam    schedule 06.01.2014
comment
Всякий раз, когда вы видите интересное форматирование (например, backspace), вы всегда можете щелкнуть ссылку редактирования, чтобы увидеть, как это сделал автор. Затем просто нажмите «Отмена», чтобы отменить редактирование.   -  person Suragch    schedule 07.11.2016
comment
github.com/henrychuangtw/AutoInsertEditText   -  person HenryChuang    schedule 18.01.2017


Ответы (5)


Использовать

s.length()

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

textMessage.getText().toString().length()
person xtempore    schedule 30.11.2010

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

что-то вроде

tv.setText(s.length() + " / " + String.valueOf(charCounts));
person Andreas Wong    schedule 30.11.2010
comment
Это даже проще - вы можете просто позвонить textMessage.length(), getText().toString() делать не нужно. developer.android.com/reference/android/widget/ - person Yoni Samlan; 30.11.2010

немного изменений в вашем коде:

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){}
}); 
person KKumar    schedule 07.04.2014
comment
Это не будет работать так, как написано - length () возвращает int, а setText ожидает String - person Martin Lockett; 17.06.2015
comment
@MartinLockett использует Integer.toString (int_type) для преобразования строки в int. - person Mahdi Rostami; 05.06.2016

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

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

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

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

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

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

person Suragch    schedule 07.11.2016

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

    }
};
person Chandan Bera    schedule 23.01.2019