Поместите постоянный текст в EditText, который должен быть недоступным для редактирования - Android

Я хочу иметь постоянный текст внутри editText как:

http://<here_user_can_write>

Пользователь не должен мочь удалить любые символы из"http://", я искал об этом и нашел это:

editText.setFilters(new InputFilter[] {
    new InputFilter() {
        public CharSequence filter(CharSequence src, int start,
            int end, Spanned dst, int dstart, int dend) {
            return src.length() < 1 ? dst.subSequence(dstart, dend) : "";
        }
    }
}); 

но я не знаю, ограничивает ли это пользователя для не удаления каких-либо символов из запуска для окончания предела. Я также не мог понять использование Заполненного класса.

Одним путем был бы хороший выбор, если мы можем поместить a TextView внутри EditText но я не думаю, что это возможно в Android, так как оба - Представления, действительно ли это возможно?

61
задан 7 January 2013 в 15:47

2 ответа

На основе комментарий @demaksee. Я расширяю EditText и переопределяю функцию onSelectionChanged. Таким образом, пользователь даже не может отредактировать префикс. Очень простой и полезный. Kotlin:

private var prefix : String? = ""

override fun onSelectionChanged(selStart: Int, selEnd: Int) {
    if (prefix != null && prefix!!.isNotBlank()) {
        var finalStart = selStart
        var finalEnd = selEnd

        val prefixLength = prefix!!.length
        if (prefixLength > selStart) {
            finalStart = prefixLength
        }

        if (prefixLength > selEnd) {
            finalEnd = prefixLength
        }

        if (finalStart == selStart && finalEnd == selEnd) {
            super.onSelectionChanged(finalStart, finalEnd)
        } else {
            val startWithPrefix = text?.startsWith(prefix ?: "") ?: prefix.isNullOrBlank()
            if (!startWithPrefix) {
                setText(prefix)
            }

            setSelection(finalStart, finalEnd)
        }
    }
}

public fun setPrefix(prefix: String) {
    editText.setText(prefix)
    editText.setSelection(prefix.length)
    this.prefix = prefix
}
1
ответ дан 31 October 2019 в 14:57

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

    final String prefix = "http://";
    final String[] aLastText = {prefix};
    et.setText(prefix);
    et.addTextChangedListener(new TextWatcher() {
        @Override
        public void onTextChanged(CharSequence s, int start, int before, int count) {}
        @Override
        public void beforeTextChanged(CharSequence s, int start, int count, int after) {}
        @Override
        public void afterTextChanged(Editable sNew) {

            if (!sNew.toString().startsWith(prefix)) {
                String sLast = aLastText[0];
                boolean isRemoving = sNew.length() < sLast.length();

                int start;
                int end = sNew.length() - 1;
                for (start = 0; start < sLast.length() && start < sNew.length(); start++) {
                    if (sLast.charAt(start) != sNew.charAt(start)) 
                        break;
                }
                int k = sLast.length() - 1;
                for (; end >= start && k >= 0; end--, k--) {
                    if (sLast.charAt(k) != sNew.charAt(end)) 
                        break;
                }
                String sEdited = sNew.toString().substring(start, ++end);
                k += isRemoving ? 1 : 0;
                k = k < prefix.length() ? prefix.length() : k;
                String sSuffix = sLast.substring(k, sLast.length());

                et.setText(prefix + sEdited + sSuffix);
                et.setSelection(et.getText().length() - sSuffix.length());
            }
            aLastText[0] = et.getText().toString();
        }
    });

Примеры:

ht5tp://localhost, 5http://localhost, http:/5/localhost-> http://5localhost

http:localhost-> http://localhost

0
ответ дан 31 October 2019 в 14:57

Другие вопросы по тегам:

Похожие вопросы: