Кількість живих символів для EditText


101

Мені було цікаво, що найкращий спосіб зробити підрахунок персонажів прямого редагування текстового поля в Android. Я дивився на це, але, здається, я не мав сенсу.

Щоб описати проблему, у мене є EditText, і я намагаюся обмежити символи до 150. Я можу це зробити за допомогою фільтра введення, проте я хочу вказати прямо під текстовим полем кількість символів, які ввів користувач (Майже як переповнення стека робить зараз).

Якби хтось міг написати невеликий фрагмент коду з прикладом або вказати мені в правильному напрямку, я б дуже цінував це.

Відповіді:


153

ви можете використовувати 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
що було б найкращим способом додати кількість підрахунків у правому нижньому куті текстового поля. Розширити редагування тексту та намалювати рядок вручну?
Ведмідь

1
Дякую, я теж отримав це, але як отримати відлік у зворотному порядку, наприклад 150,149,148,147 .... під час введення тексту.
vinay Maneti

6
Це вирішено шляхом заміни цього рядка mTextView.setText (String.valueOf (150-s.length ())); замість mTextView.setText (String.valueOf (s.length ()));
vinay Maneti

Моя проблема схожа на @Bear have. Мені потрібно показати цей відлік тексту внизу від редагування тексту. У когось є чим поділитися в цій довідці. Дякую.
Суреш Шарма

107

Ви можете зробити підрахунок символів із самого 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 для стилю лічильника.

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


3
це саме те, що я шукав :) чистий, бібліотечний імпл. спасибі
VPZ

3
Чи повинна бути прийнята відповідь! Я цілком пропустив ці атрибути!
sud007

24

Ви можете це робити з 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>

Чудово це працювало для мене, але як я міняю колір лічильника?
Еріх Гарсія

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;

========== Всередині 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);

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

Просто встановіть ці два рядки TextInputLayoutу своєму XML-файлі:

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

Великий про це не знав. Здається, завжди є кращим рішенням обернути 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>

1

Я зіткнувся з тією ж проблемою, і я спробував метод Камерона. Це працює, але є незначна помилка: якщо користувач використовує копію та вставляти, то він не може підрахувати символи. Тому я пропоную зробити після зміни тексту, як нижче:

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


0

Спробуйте зробити щось подібне.

Це рішення може бути більш ефективним на відміну від отримання CharSequence.length. Кожен раз, коли ви натискаєте на м'яку клавіатуру, подія запускається; тому, якщо ви робите довжину, вона буде рахувати CharSequence кожен раз, що може сповільнитись, якщо ви почнете отримувати великі CharSequence. Слухач події щодо зміни тексту вказує на підрахунок до та після. Це добре працює для збільшення та зменшення значень

@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 найкращий підхід до цього
Naveed Ahmad

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()
            }
        });
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.