Как отключить позиционирование курсора и выделение текста в 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);
    }

}

Попробуй это:

mEditText.setMovementMethod(null);

Это сбросит фокус курсора на последнюю позицию текста

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)
    }
  }
})
Другие вопросы по тегам