Количество живых символов для EditText

103

Мне было интересно, как лучше всего подсчитать количество символов в текстовом поле редактирования в Android. Я смотрел на это, но, похоже, не мог понять этого.

Чтобы описать проблему, у меня есть EditText, и я пытаюсь ограничить количество символов до 150. Я могу сделать это с помощью входного фильтра, однако я хочу показать прямо под текстовым полем количество символов, введенных пользователем (почти как сейчас переполнение стека).

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

Тейлор Перкинс
источник

Ответы:

154

вы можете использовать TextWatcher, чтобы увидеть, когда текст изменился

private TextView mTextView;
private EditText mEditText;
private final TextWatcher mTextEditorWatcher = new TextWatcher() {
        public void beforeTextChanged(CharSequence s, int start, int count, int after) {
        }

        public void onTextChanged(CharSequence s, int start, int before, int count) {
           //This sets a textview to the current length
           mTextView.setText(String.valueOf(s.length()));
        }

        public void afterTextChanged(Editable s) {
        }
};

вы устанавливаете TextWatcher для текста редактирования с помощью

mEditText.addTextChangedListener(mTextEditorWatcher);
Кэмерон Кетчем
источник
5
пробовал, отлично работает! следует выбрать правильный ответ!
Патрик Боос
2
как лучше всего добавить счетчик, скажем, в правом нижнем углу текстового поля. Расширить текст редактирования и нарисовать строку вручную?
Bear
1
Спасибо, я тоже понял, но как начать отсчет в обратном порядке, например, 150 149 148 147 .... при вводе текста.
vinay Maneti
6
Решено заменой этой строчкой mTextView.setText (String.valueOf (150-s.length ())); вместо mTextView.setText (String.valueOf (s.length ()));
vinay Maneti
Моя проблема похожа на проблему @Bear. Мне нужно показать этот текст обратного отсчета прямо под текстом редактирования. Кому-нибудь есть чем поделиться в этой ссылке. Спасибо.
Суреш Шарма,
108

Вы можете выполнять подсчет символов из самого xml с помощью оболочки TextInputLayout для EditText, представленной в SupportLibrary v23.1

Просто оберните свой EditText в TextInputLayout и установите CounterEnabled на true и установите counterMaxLength.

<android.support.design.widget.TextInputLayout
    android:id="@+id/textContainer"
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    app:counterEnabled="true"
    app:counterMaxLength="20"
    >
    <EditText
        android:id="@+id/text"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:hint="Text Hint"
        />
</android.support.design.widget.TextInputLayout>

Вы получите существенное влияние , как это

Вы можете использовать counterOverflowTextAppearance , counterTextAppearance для стилизации счетчика.

РЕДАКТИРОВАТЬ

Из документации Android.

Класс TextInputEditText предоставляется для использования в качестве дочернего элемента этого макета. Использование TextInputEditText позволяет TextInputLayout лучше контролировать визуальные аспекты любого ввода текста. Пример использования такой:

     <android.support.design.widget.TextInputLayout
         android:layout_width="match_parent"
         android:layout_height="wrap_content">

     <android.support.design.widget.TextInputEditText
             android:layout_width="match_parent"
             android:layout_height="wrap_content"
             android:hint="@string/form_username"/>

 </android.support.design.widget.TextInputLayout>

TextInputLayout TextInputEditText

Мидхун Виджаякумар
источник
3
это было именно то, что я искал :) чистую библиотеку поддержки. спасибо
VPZ
3
Должен быть принятый ответ! Я полностью упустил эти атрибуты!
sud007
25

Вы можете сделать это TextInputLayoutи совместить библиотеки с:

app:counterEnabled="true"
app:counterMaxLength="420"

и заполните:

<android.support.design.widget.TextInputLayout
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    app:counterEnabled="true"
    app:counterMaxLength="420">

    <EditText
      android:layout_width="match_parent"
      android:layout_height="wrap_content"
      android:maxLength="420" />

</android.support.design.widget.TextInputLayout>
Даниэль Гомес Рико
источник
Отлично, это сработало для меня, но как я могу изменить цвет счетчика?
Erich García
14

в xml добавьте этот атрибут для editText

    android:maxLength="80"

в java добавить этого слушателя

  ed_caption.addTextChangedListener(new TextWatcher() {
        @Override
        public void beforeTextChanged(CharSequence s, int start, int count, int after) {

        }

        @Override
        public void onTextChanged(CharSequence s, int start, int before, int count) {

        }

        @Override
        public void afterTextChanged(Editable s) {
            tv_counter.setText(80 - s.toString().length() + "/80");

        }
    });
Амаль Кронц
источник
7

Это очень просто Следуйте инструкциям ниже:

==== Добавьте их в свой импорт ===

import android.text.Editable;
import android.text.TextWatcher;

===== Определите это =====

private TextView sms_count;

========== Внутри при создании =====

sms_count = (TextView) findViewById(R.id.textView2);


final TextWatcher txwatcher = new TextWatcher() {
   public void beforeTextChanged(CharSequence s, int start, int count, int after) {
   }

   public void onTextChanged(CharSequence s, int start, int before, int count) {

      sms_count.setText(String.valueOf(s.length()));
   }

   public void afterTextChanged(Editable s) {
   }
};

sms_message.addTextChangedListener(txwatcher);
Депиндер Бхарти
источник
5
    You can use TextWatcher class to see text has changed and how much number of character remains.Here i have set counter of 140 characters.

    EditText typeMessageToPost;
    TextView number_of_character;
public void onCreate(Bundle savedBundleInstance) {
        super.onCreate(savedBundleInstance);
setContentView(R.layout.post_activity);
typeMessageToPost.addTextChangedListener(mTextEditorWatcher);
}
private final TextWatcher mTextEditorWatcher=new TextWatcher() {

        @Override
        public void onTextChanged(CharSequence s, int start, int before, int count) {
            // TODO Auto-generated method stub

        }

        @Override
        public void beforeTextChanged(CharSequence s, int start, int count,
                int after) {
            // TODO Auto-generated method stub

        }

        @Override
        public void afterTextChanged(Editable s) {
            // TODO Auto-generated method stub
            number_of_character.setText(String.valueOf(140-s.length()));
        }
    };
Рана Пратап Сингх
источник
Спасибо @RavishSharma :) Я ценю ваш комментарий.
Рана Пратап Сингх
4

Просто установите эти 2 строки TextInputLayoutв свой XML-файл:

app:counterEnabled="true"
app:counterMaxLength="200"
mortezahosseini
источник
Грейт не знал об этом. Кажется, что всегда лучшим решением будет обернуть Edittext в TextInputLayout.
Стефан Шпренгер
3

Это решение использует Kotlinи показывает количество оставшихся символов. Кроме того, если текущее количество символов превышает ограничение в 50, цвет текста изменится на красный.

Котлин

private val mTitleTextWatcher = object : TextWatcher {
    override fun beforeTextChanged(s: CharSequence, start: Int, count: Int, after: Int) {}

    override fun onTextChanged(s: CharSequence, start: Int, before: Int, count: Int) {
        if(YOUR_EDIT_TEXT_ID.text.toString().trim().length < 51){
            YOUR_CHAR_LEFT_TEXTVIEW_ID.text = (50 - YOUR_EDIT_TEXT_ID.text.toString().trim().length).toString()
            YOUR_CHAR_LEFT_TEXTVIEW_ID.setTextColor(Color.BLACK)
        }
        else{
            YOUR_CHAR_LEFT_TEXTVIEW_ID.text = "0"
            YOUR_CHAR_LEFT_TEXTVIEW_ID.setTextColor(Color.RED)
        }
    }

    override fun afterTextChanged(s: Editable) {}
}

Также не забудьте добавить TextWatcherв свойEditText

YOUR_EDIT_TEXT_ID.addTextChangedListener(mTitleTextWatcher)
Грантеспо
источник
3

Вы можете добавить счетчик к вашему TextInputEditText, обернутому в TextInputLayout. Как вы можете видеть в примере, counterEnabledэта функция включает и counterMaxLenghопределяет количество символов для нее.

<com.google.android.material.textfield.TextInputLayout
        android:id="@+id/til_title"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        app:counterEnabled="true"
        app:counterMaxLength="50">
    <com.google.android.material.textfield.TextInputEditText
            android:id="@+id/et_title"
            android:layout_width="match_parent"
            android:layout_height="match_parent"/>
</com.google.android.material.textfield.TextInputLayout>
Сатистский
источник
2

Я столкнулся с той же проблемой и попробовал метод Кэмерона. Он работает, но есть небольшая ошибка: если пользователь использует копирование и вставку, он не может подсчитать символы. Поэтому я предлагаю сделать после изменения текста, как показано ниже:

    private final TextWatcher mTextEditorWatcher = new TextWatcher() {
         public void beforeTextChanged(CharSequence s, int start, int count, int after) {

         }

         public void onTextChanged(CharSequence s, int start, int before, int count) {

         }

          public void afterTextChanged(Editable s) {
             //This sets a textview to the current length
             mTextView.setText(String.valueOf(s.length()));
         }
    };
Гилберт Ли
источник
1

Используйте android: maxLength = "140"

Это должно сработать. :)

надеюсь, это поможет

Алиреза Ганбариния
источник
0

Попробуйте сделать что-нибудь подобное.

Это решение может быть более производительным, чем получение CharSequence.length. Каждый раз, когда вы нажимаете на программную клавиатуру, событие запускается; поэтому, если вы сделаете длину, он будет каждый раз считать CharSequence, что может замедлиться, если вы начнете попадать в большие CharSequnces. Слушатель событий при изменении текста фиксирует счетчик до и после. Это хорошо работает для значений увеличения и уменьшения

@Override
        public void beforeTextChanged(CharSequence charSequence, int start, int count, int after) {
            int tick = start + after;
            if(tick < mMessageMax) {
                int remaining = mMessageMax - tick;
                ((TextView)findViewById(R.id.contact_us_chars)).setText(String.valueOf(remaining));
            }
        }
Виктор Дж. Гарсия
источник
это эффект permosrmatce, TextWatcher - лучший подход для этого
Навид Ахмад,
0

попробуй это

private TextWatcher textWatcher = new TextWatcher() {
    @Override
    public void beforeTextChanged(final CharSequence s, final int start, final int count, final int after) {
        editText.post(new Runnable() {
            @Override
            public void run() {
                if (length < 100) {
                    if (count > 0 && after <= 0)/*remove emoij*/ {
                        length--;
                    } else if (count > after)/*remove text*/ {
                        length--;
                    } else if (count == 0 && after > 1)/*emoij*/ {
                        ++length;
                    } else if (count == 0 && after == 1)/*Text*/ {
                        ++length;
                    } else if (count > 0 && after > 1) {
                        ++length;
                    }
                    if (s.length() <= 0)
                        length = 0;
                    Log.w("MainActivity", " Length: " + length);
                } else {
                    if (count > 0 && after <= 0)/*remove emoij*/ {
                        length--;
                    } else if (count > after)/*remove text*/ {
                        length--;
                    }
                    Log.w("MainActivity", " Length: " + length);
                }

                if (length == 100) {
                    editText.setFilters(new InputFilter[]{new InputFilter.LengthFilter(s.length())});
                } else {
                    editText.setFilters(new InputFilter[]{});
                }
            }
        });
    }

    @Override
    public void onTextChanged(CharSequence s, int start, int before, int count) {

    }

    @Override
    public void afterTextChanged(Editable s) {

    }
};

`

Нанкай
источник
0

Ясный путь;

abstract class CharacterWatcher : TextWatcher {
    override fun afterTextChanged(text: Editable?) {
        afterCharacterChanged(text?.lastOrNull(), text?.length)
    }

    override fun beforeTextChanged(text: CharSequence?, start: Int, count: Int, before: Int) {}

    override fun onTextChanged(text: CharSequence?, start: Int, before: Int, count: Int) {}

    abstract fun afterCharacterChanged(char: Char?, count: Int?)
}



 editText.addTextChangedListener(new CharacterWatcher() {
            @Override
            public void afterCharacterChanged(@Nullable Character character, @Nullable Integer count) {
                action()
            }
        });
Кафер Мерт Джейхан
источник