33

我正在寻找一种方法来防止用户将光标位置移动到任何地方。光标应始终停留在当前 EditText 值的末尾。除此之外,用户应该不能在 EditText 中选择任何内容。您知道如何在 Android 中使用 EditText 实现这一点吗?

澄清:用户应该能够插入文本,但只能在末尾。

4

5 回答 5

52

我有同样的问题。这最终为我工作:

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);
    }

}
于 2012-10-19T20:49:00.240 回答
8

试试这个:

mEditText.setMovementMethod(null);
于 2014-06-12T09:04:24.057 回答
7

这会将光标焦点重置到文本的最后一个位置

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 属性

机器人:光标可见

或java函数

setCursorVisible(布尔值)

禁用edittext的闪烁光标

于 2012-06-23T15:04:11.550 回答
1

听起来最好的方法是创建自己的CustomEditText类并覆盖/修改任何相关方法。您可以在此处查看源代码EditText

public class CustomEditText extends EditText {

    @Override
    public void selectAll() {
        // Do nothing
    }

    /* override other methods, etc. */

}
于 2012-06-23T16:17:30.487 回答
0

是的,我知道怎么做 =) 就去做吧:

复制辅助类:

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) }

  if (listener != null) {
    setSpan(SelectionSpanWatcher(listener), 0, length, Spanned.SPAN_INCLUSIVE_INCLUSIVE)
  }
}

然后使用复制的代码如下(使用androidx.core.widget.addTextChangedListenerfrom android-ktx):

editText.addTextChangedListener(afterTextChanged = { editable ->
  editable?.setOnSelectionChangedListener { _, _, _, _, _ ->
    editText.postOnAnimation {
      editText.setSelection(editText.text.length)
    }
  }
})
于 2021-07-11T20:44:08.563 回答