功能:
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);
}
}