Підрахунок символів у редакторі змінених 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>
Гесам

2
Щоразу, коли ви бачите цікаве форматування (наприклад, "backspace"), ви завжди можете натиснути посилання "редагувати", щоб побачити, як це зробив автор. Потім просто натисніть «Скасувати», щоб відмовитись від вашої редакції.
Сурагч

Відповіді:


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/…
Йоні Самлан

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 очікує String
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 = новий 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.