Как отключить позиционирование курсора и выделение текста в EditText? (Android)
Я ищу способ предотвратить перемещение курсора в любом месте. Курсор всегда должен оставаться в конце текущего значения EditText. В дополнение к этому пользователь не должен иметь возможности выбирать что-либо в EditText. Есть ли у вас идеи, как реализовать это в Android с помощью EditText?
Чтобы уточнить: пользователь должен иметь возможность вставлять текст, но только в конце.
5 ответов
У меня такая же проблема. Это сработало для меня:
public class CustomEditText extends EditText {
@Override
public void onSelectionChanged(int start, int end) {
CharSequence text = getText();
if (text != null) {
if (start != text.length() || end != text.length()) {
setSelection(text.length(), text.length());
return;
}
}
super.onSelectionChanged(start, end);
}
}
Это сбросит фокус курсора на последнюю позицию текста
editText.setSelection(editText.getText().length());
Этот метод отключит перемещение курсора на ощупь
public class MyEditText extends EditText{
@Override
public boolean onTouchEvent(MotionEvent event)
{
final int eventX = event.getX();
final int eventY = event.getY();
if( (eventX,eventY) is in the middle of your editText)
{
return false;
}
return true;
}
}
И Вы можете использовать любой атрибут xml
андроид:cursorVisible
или функция Java
setCursorVisible(булево)
отключить мигающий курсор редактирования текста
Похоже, лучший способ сделать это, чтобы сделать свой собственный CustomEditText
Класс и переопределить / изменить любые соответствующие методы. Вы можете увидеть исходный код для EditText
Вот.
public class CustomEditText extends EditText {
@Override
public void selectAll() {
// Do nothing
}
/* override other methods, etc. */
}
Да, я знаю, как это сделать =) просто сделай это:
Скопируйте вспомогательный класс:
class SelectionSpanWatcher(
private val listener: OnChangeSelectionListener
) : SpanWatcher {
override fun onSpanAdded(text: Spannable?, what: Any?, start: Int, end: Int) {
/* do nothing */
}
override fun onSpanRemoved(text: Spannable?, what: Any?, start: Int, end: Int) {
/* do nothing */
}
override fun onSpanChanged(text: Spannable?, what: Any?, oStart: Int, oEnd: Int, nStart: Int, nEnd: Int) {
when (what) {
SELECTION_START -> listener.onSelectionChanged(Selection.START, oStart, oEnd, nStart, nEnd)
SELECTION_END -> listener.onSelectionChanged(Selection.END, oStart, oEnd, nStart, nEnd)
}
}
enum class Selection {
START,
END
}
fun interface OnChangeSelectionListener {
fun onSelectionChanged(selection: Selection, oStart: Int, oEnd: Int, nStart: Int, nEnd: Int)
}
}
Затем скопируйте метод расширения:
fun Editable.setOnSelectionChangedListener(listener: OnChangeSelectionListener) {
getSpans(0, length, SelectionSpanWatcher::class.java)
.forEach { span -> removeSpan(span) }
setSpan(SelectionSpanWatcher(listener), 0, length, Spanned.SPAN_INCLUSIVE_INCLUSIVE)
}
Затем используйте скопированный код следующим образом (используется
androidx.core.widget.addTextChangedListener
из
android-ktx
):
editText.addTextChangedListener(afterTextChanged = { editable ->
editable?.setOnSelectionChangedListener { _, _, _, _, _ ->
editText.postOnAnimation {
editText.setSelection(editText.text.length)
}
}
})