Используя ваше определение дельты, позвольте n = 1/(1 + delta)
(или delta/(1 + delta)
), и все будет так, как вы описали.
Я думаю, что InputFilter
, который отклоняет все изменения, является хорошим решением:
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) : "";
}
}
});
Изменить: dlazar предложил (ниже) изменить return
в dst.subSequence (dstart, dend)
для преодоления поведения, которое удаляет слова.
Я не вижу связанный метод для того атрибута в классе EditText. Однако существуют другие подобные вещи, Вы могли использовать такой в качестве android:focus/setFocusable(boolean)
или создать другой TextView чей android:editable="false"
и использование setVisiblilty()
для переключения между доступным для редактирования и не доступными для редактирования представлениями. Если Вы будете использовать View.GONE
, то пользователь никогда не будет знать, что существует два EditTexts.
, Если Ваше ощущение себя, амбициозное, Вы могли бы, вероятно, сделать что-то с EditText onTextChanged
, слушатель как наличие его реагирует с setText
.
Вы попробовали setText (java.lang. CharSequence, android.widget. TextView. BufferType) ? Это описано как:
Наборы текст, который должен отобразить этот TextView (см. setText (CharSequence)) и также устанавливает, хранится ли он в буфере styleable/spannable и является ли это доступным для редактирования .
(шахта акцента)
[Размещение нового ответа, поскольку я не могу комментировать ответ Джозефа.]
Входной фильтр работает нормально , но он имеет тонкую ошибку в этом: набрав над выбором, удалит весь текст.
Например, скажем, у вас есть текст «Фу»
в Edittext
. Если вы выберете все это (например, дважды щелкнув его) и введите «A»
, текст исчезнет. Это связано с тем, что вход ввода
будет называться:
filter("a", 0, 1, "foo", 0, 3);
предлагаемый входной фильтр вернет пустую строку в этом случае (поскольку SRC.Length () <1
- это false
), который объясняет отсутствующий текст.
Решением является просто возвращение DST.субовут (DStart, Dend)
в функции фильтра. Это будет работать нормально даже для делеций.