Я хочу иметь постоянный текст внутри 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, так как оба - Представления, действительно ли это возможно?
На основе комментарий @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
}
Код ниже работ для меня. Это обрабатывает случаи, когда пользователь редактирует префикс, удаляет его, вставляет текст от буфера, изменяет выделенный текст. Если пользователь изменяет префикс, перемещения фокуса в конец префикса.
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