Количество живых символов для EditText - PullRequest
89 голосов
/ 10 июня 2010

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

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

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

Ответы [ 13 ]

146 голосов
/ 16 декабря 2010

вы можете использовать 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);
96 голосов
/ 29 ноября 2015

Вы можете выполнять подсчет символов из самого 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>

Вы получите материальный эффект, подобный this

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

EDIT

Из документации 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

18 голосов
/ 19 августа 2017

Вы можете сделать это с 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>
10 голосов
/ 22 мая 2017

в 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");

        }
    });
6 голосов
/ 09 апреля 2011

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

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

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 голосов
/ 11 сентября 2014
    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()));
        }
    };
4 голосов
/ 16 января 2017

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

app:counterEnabled="true"
app:counterMaxLength="200"
1 голос
/ 14 февраля 2019

Если вы используете библиотеку androidX вместо устаревших библиотек поддержки

<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>
1 голос
/ 16 октября 2016

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

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

Надеюсь, что поможет

1 голос
/ 25 марта 2015

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

    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()));
         }
    };
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...