Подтвердить что ты не робот

Счет живого персонажа для EditText

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

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

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

4b9b3361

Ответ 1

вы можете использовать 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 для edittext с помощью

mEditText.addTextChangedListener(mTextEditorWatcher);

Ответ 2

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

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

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

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

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

private TextView sms_count;

========== Внутри On Create =====

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

Ответ 4

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

Ответ 5

Вы можете сделать это с помощью 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>

Ответ 6

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

app:counterEnabled="true"
app:counterMaxLength="200"

Ответ 7

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

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

Ответ 8

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

        }
    });

Ответ 9

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

Это решение может быть более эффективным, в отличие от получения 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));
            }
        }

Ответ 10

Использовать android: maxLength = "140"

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

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