Utility class for manipulating cursors and selections in CharSequences. A cursor is a selection where the start and end are at the same offset.

引用一段安卓源码中Selection类的注释,Selection是一个在 CharSequences中操纵游标和”选择”(不知道怎么翻译好。。)的一个工具类。游标就是起点和终点在同一位置的”选择”。

EditText中setSelection系列方法就是通过Selection实现的。

Selection类很简单,包含了多个静态方法

public static final int getSelectionStart(CharSequence text)
public static final int getSelectionEnd(CharSequence text)

获取选择区域的起(终)点或者游标位置,如果没有选择区域或者游标,则返回-1

public static final void setSelection(Spannable text, int index)
public static final void selectAll(Spannable text)
public static void setSelection(Spannable text, int start, int stop)

设置选择区域或者游标位置,最终都是通过调用
setSelection(Spannable text, int start, int stop)
方法实现的

public static final void extendSelection(Spannable text, int index)

扩展选择区域,index为偏移量

public static final void removeSelection(Spannable text)

移除所有Selection

public static boolean moveUp(Spannable text, Layout layout)
public static boolean moveDown(Spannable text, Layout layout)
public static boolean moveLeft(Spannable text, Layout layout)
public static boolean moveRight(Spannable text, Layout layout)
public static boolean moveToLeftEdge(Spannable text, Layout layout)
public static boolean moveToRightEdge(Spannable text, Layout layout)

移动游标的系列方法,参数text我们可以通过EditText中的getText()获得,layout可以通过EditText中的getLayout()获得

public static boolean extendUp(Spannable text, Layout layout)
public static boolean extendDown(Spannable text, Layout layout)
public static boolean extendLeft(Spannable text, Layout layout)
public static boolean extendRight(Spannable text, Layout layout)
public static boolean extendToLeftEdge(Spannable text, Layout layout)
public static boolean extendToRightEdge(Spannable text, Layout layout)

扩展游标的系列方法

其实以上所有与游标操作有关系的函数最终都是通过调用以下两个方法实现的

public static void setSelection(Spannable text, int start, int stop) {// int len = text.length();// start = pin(start, 0, len);  XXX remove unless we really need it// stop = pin(stop, 0, len);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);}
}
public static final void extendSelection(Spannable text, int index) {if (text.getSpanStart(SELECTION_END) != index)text.setSpan(SELECTION_END, index, index, Spanned.SPAN_POINT_POINT);
}

再看这两个方法,其实最终的实现就是setSpan方法。

其中还有两个静态变量Selection.SELECTION_START和Selection.SELECTION_END

public static final Object SELECTION_START = new START();
public static final Object SELECTION_END = new END();private static final class START implements NoCopySpan { }
private static final class END implements NoCopySpan { }

这两个对象就是选择区域起点与终点的标志。分别为START和END的实例,但是都继承自NoCopySpan。而NoCopySpan没有任何函数,只有一个内部类。我们看看代码注释。

This interface should be added to a span object that should not be copied into a new Spenned when performing a slice or copy operation on the original Spanned it was placed in.

大致意思是继承了该接口的span对象不应该被拷贝或者复制到另一个Spanned对象中。

Selection使用简介相关推荐

  1. Feature Selection Techniques

    Table of Contents 1  Feature Selection Techniques特征选择技术 1.1  Agenda 1.2  Introduction to Feature Sel ...

  2. html Selection

    一个很全面的html dom API https://developer.mozilla.org/en-US/docs/Web/API/Selection Introduction(简介) Selec ...

  3. 链路聚合(Link Aggregation)与权重

    链路聚合(Link Aggregation)与权重 介绍 链路聚合通过聚合多条并行的物理链路,对上层协议表现为一条逻辑链路,来提高吞吐量和冗余性.常见的链路聚合技术有Cisco的Etherchanne ...

  4. UA MATH574M 统计学习V Variable Selection简介

    UA MATH574M 统计学习V Variable Selection简介 两个基础方法 Ranking Variables Best Subset Algorithm 对基础方法的改进 Gener ...

  5. 二次开发photoshop_Photoshop 101:Web开发人员简介

    二次开发photoshop 介绍 (Introduction) Often, when working as web developer, we need to integrate templates ...

  6. 【论文笔记】 LSTM-BASED DEEP LEARNING MODELS FOR NONFACTOID ANSWER SELECTION

    一.简介 这篇论文由IBM Watson发表在2016 ICLR,目前引用量92.这篇论文的研究主题是answer selection,作者在这篇论文基础上[Applying Deep Learnin ...

  7. JavaScript标准Selection操作

    简介 术语 属性 方法 document.activeElement document.designMode = 'on'; 简介 selection是对当前激活选中区(即高亮文本)进行操作. 在非I ...

  8. 【Netty】NIO 网络通信 SelectionKey 常用 API 简介

    文章目录 I . SelectionKey 简介 II . SelectionKey 事件简介 III . SelectionKey 常用 API 简介 I . SelectionKey 简介 1 . ...

  9. 矩阵分析与多元统计12 0-1矩阵 交换矩阵简介

    矩阵分析与多元统计12 0-1矩阵 交换矩阵简介 选择矩阵 交换矩阵 顾名思义,0-1矩阵就是所有元素取值均为0和1的矩阵,这类矩阵在矩阵分析.多元统计乃至组合学和图论中都有很重要的应用.在这个主题中 ...

最新文章

  1. 图论 ---- 图论构造成二分图去判断 F. Figure Fixing
  2. Java8 Stream性能如何及评测工具推荐
  3. 买了台任天堂Switch
  4. tomcat_动态java项目的目录结构
  5. 从状态转移看:载波侦听多路访问/冲突避免(CSMA/CA)
  6. ajax实现多级联动菜单,jquery 实现二级/三级/多级联动菜单的思路及代码
  7. 用户界面和兼容性测试
  8. linux 挖矿效率_linux 服务器发现了挖矿病毒
  9. CentOS6.2(64bit)下mysql5.6.16主从同步配置
  10. php如何自动阅卷,智能评卷系统 自动阅卷软件
  11. JavaScript培训
  12. linux卸载intel驱动程序,Linux的英特尔图形驱动程序调试工具删除Android支持
  13. Spring系列七:JDK 动态代理和 CGLIB 代理
  14. html水晶按钮图片,css 如何实现一个水晶按钮的效果呢?
  15. 从零开始制作点餐Android app(一)
  16. TinyXML2使用教程
  17. 什么是产生式知识表示?给出这种表示方法的有缺点?
  18. 京东区块链之科普篇:京东在区块链技术领域的应用与布局
  19. Vue2.x动态组件的使用实现组件整合大屏展示
  20. 大数据的3V特性, 种类, 总量, 速度。

热门文章

  1. 如何连接上隐藏WiFi
  2. 如何更改linux的语言为英文
  3. android莫名其妙打开支付宝,【未解决】用uiautomator2实现安卓手机打开支付宝自动收集蚂蚁森林能量...
  4. 如何利用命令查看当前linux系统的桌面环境是KED 或者是GNOME
  5. 我用Java写的象棋外挂成功了
  6. 三菱fx3u+485ADP-MB与3台台达变频器modbus通讯程序 通过三菱fx3u 485ADP-MB板对3台台达变频器进行modbus通讯,实现频率设定,启停控制,输出频率读取,输出电压读取
  7. iPhone6,好吗?
  8. Pycharm使用加速技巧
  9. 抖音三联屏如何制作?影视剪辑如何制作三联屏
  10. 论ChatGPT的优势及劣势