Selection用法

功能:
     1.用来操作文本里的光标;
     2.用来选中文本里的内容;
     3.光标实质上是文本选中的一个特例,如果选中文本的start、end值是一样的,则会显示成一个光标;

接口:  
     其常用到的接口有:
     final static void selectAll(Spannable text);
     //全选

     final static void setSelection(Spannable text, int index);
     //移动光标到指定的位置

     static void setSelection(Spannable text, int start, int stop);
     //实际选中的字符从  start 开始,共有 stop - start个字符被选中

     内部有2个静态对象:

   public static final Object SELECTION_START = new START();

    public  static  final  Object  SELECTION_END  =  new  END();
     

实例:
     Editable editable = etEditText.getText();          //etEditText为EditText
     editable.append("abcdefg");
     输入框里的文本内容为: abcdefg
     1.Selection.selectAll(editable);
         abcdefg
        效果:文字全选
     2.Selection.setSelection(editable, 1);
         a|bcdefg
        效果:光标处在a与b之间。
     3.Selection.setSelection(editable, 1, 3);
         abcdefg
        效果:选中了bc
     4.Selection.setSelection(editable, 1, 1);
         a|bcdefg
        效果:光标处在a与b之间
     5.Selection.setSelection(editable, et.length());
        abcdefg|
        效果:光标处在最后面

总结:
     1.参数类型均为Spannable,所以可以直接针对EditeText.getText()来进行操作;
     2.移动光标到指定位置与选中文本是同一个原理,在某个位置显示光标,相当于从该位置开始选中的文本长度为0,从其源码可以看到,实际上都是调用了同一个方法:
     
   /**
     * Move the cursor to offset <code>index</code>.
     */
    public static final void setSelection(Spannable text, int index) {
        setSelection(text, index, index);
    }

    /**
     * Select the entire text.
     */
    public static final void selectAll(Spannable text) {
        setSelection(text, 0, text.length());
    }

     3.设置光标的原理:其内部就是针对Spannable文本对象,采用setSpan()方法对文本内容增加了一些额外的处理功能。只不过里面用到了SELECTION_START、SELECTION_END这2个特殊对象,暂不清楚为什么这个会出现光标。
     

   public static void setSelection(Spannable text, int start, int stop) {

        int ostart = getSelectionStart(text);

        int oend = getSelectionEnd(text);


        if (ostart != start || oend != stop) {

            text.setSpan(SELECTION_START, start, start,

                         Spanned.SPAN_POINT_POINT|Spanned.SPAN_INTERMEDIATE);

            text.setSpan(SELECTION_END, stop, stop,

                         Spanned.SPAN_POINT_POINT);

        }

    }



评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值