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

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

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

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

Ответы [ 13 ]

0 голосов
/ 30 мая 2019

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

Kotlin

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)
0 голосов
/ 13 февраля 2019

попробуйте

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 голосов
/ 24 сентября 2013

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

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