android 系统光标,如何定位android系统中光标的位置

在Android中,当使用TextView或EditText时,光标默认会出现在字符串开头。要将其定位到末尾,需要在setText方法中进行特殊处理。通过检查是否为Editable类型,并使用Selection.setSelection()方法可以实现光标移到文本末尾。在编写应用时,可以通过获取文本,判断其是否为Spannable类型,然后设置光标位置,例如将光标置于文本末尾。
摘要由CSDN通过智能技术生成

满意答案

Android中有很多可编辑的弹出框,其中有些是让我们来修改其中的字符,这时光标位置定位在哪里呢?

刚刚解了一个bug是关于这个光标的位置的,似乎Android原生中这种情况是把光标定位到字符串的最前面。需求是将光标定位到字符的最后面。

修改的地方是TextView这个控件,因为EditText也是继承了TextView。在setText方法中有:

1 private void setText(CharSequence text, BufferType type,

2 boolean notifyBefore, int oldlen) {

3 ……

4 if (text instanceof Spannable) {

5 Spannable sp = (Spannable) text;

6

7 ……

8 if (mMovement != null) {

9 mMovement.initialize(this, (Spannable) text);

10 //文本是不是Editable的。

11 if(this instanceof Editable)

12 //设定光标位置

13 Selection.setSelection((Spannable)text, text.length());

14

15 ……

16 }

从红色代码中可以看出,google是要光标处在缺省文本的末端,但是,log发现 (this instanceof Editable)非真,也就是说Selection.setSelection((Spannable)text, text

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Android EditText,可以通过调用EditText的`getSelectionStart()`和`getSelectionEnd()`方法来获取光标位置。这两个方法返回的是光标所在位置的索引值,可以用于判断光标位置。举个例子,如果要判断光标是否在EditText的第一个字符位置,可以这样写: ``` int selectionStart = editText.getSelectionStart(); if (selectionStart == 0) { // 光标在第一个字符位置 } else { // 光标不在第一个字符位置 } ``` 在InputFilter,可以通过传入的`source`参数来获取用户输入的文本,`start`参数表示用户输入的文本的起始位置,`end`参数表示用户输入的文本的结束位置。通过这些参数,可以计算出光标所在的位置。例如,要限制用户输入的文本长度不能超过10个字符,可以这样写: ``` public class MyInputFilter implements InputFilter { private int maxLength = 10; @Override public CharSequence filter(CharSequence source, int start, int end, Spanned dest, int dstart, int dend) { int keep = maxLength - (dest.length() - (dend - dstart)); if (keep <= 0) { // 已经达到最大长度,不能再输入 return ""; } else if (keep >= end - start) { // 可以输入全部文本 return null; } else { // 只能输入部分文本 int selectionStart = editText.getSelectionStart(); if (selectionStart < dstart || selectionStart > dend) { // 光标不在待插入的文本范围内,不需要调整光标位置 return source.subSequence(start, start + keep); } else { // 光标在待插入的文本范围内,需要调整光标位置 int newSelectionStart = dstart + keep; editText.setSelection(newSelectionStart); return source.subSequence(start, start + keep); } } } } ``` 这里的`editText`是指要限制长度的EditText对象。在`filter`方法,首先判断已经输入的文本长度是否已经达到最大长度,如果达到了最大长度,就返回空字符串,表示不能再输入了。如果还可以继续输入,就计算出可以输入的文本长度`keep`,然后判断用户输入的文本长度是否超过`keep`,如果超过了,就只能输入部分文本,同时需要调整光标位置;如果没有超过,就可以输入全部文本,不需要调整光标位置
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值