一、设置/获取光标位置
设置光标位置
void android.widget.EditText.setSelection(int index)
获取光标位置
int android.widget.TextView.getSelectionStart()
int android.widget.TextView.getSelectionEnd()
二、添加表情
添加表情就是在EditText(TextView)里添加图片,由于TextView里的内容是支持html标签的,所以当需要显示图片的时候可以使用<img />标签。
当需要显示html格式的内容时,需要用如下方法:
Spanned android.text.Html.fromHtml(String source, ImageGetter imageGetter, TagHandler tagHandler)
该方法把含有html标签的字符串转化成TextView使用的不包含html标签的字符串。
第一个参数是包含html标签的字符串。
第二个参数就是具体加载图片的接口,实现该接口完成图片的加载。
第三个参数是自定义标签的接口,无需自定义标签的情况下,传入null即可。
三、加粗、斜体、超链接、。。。
1.在内容里添加html标签,使用上述方式二的Html.from方法转化一下即可。
2.通过SpannableString对象完成。
SpannableString ss = new SpannableString("字体测试字体大小一半两倍前景色背景色正常粗体斜体粗斜体下划线删除线x1x2电话邮件网站短信彩信地图X轴综合");
ss.setSpan(new StyleSpan(android.graphics.Typeface.NORMAL), 18, 20, Spanned.SPAN_EXCLUSIVE_EXCLUSIVE); //正常
ss.setSpan(new StyleSpan(android.graphics.Typeface.BOLD), 20, 22, Spanned.SPAN_EXCLUSIVE_EXCLUSIVE); //粗体
mTextView.setText(ss);
更多用法见demo。
四、总结
不管html还是SpannableString,他们都是一个原理实现的。
首先看TextView的方法签名:
void android.widget.TextView.setText(CharSequence text)
CharSequence android.widget.TextView.getText()
我们可以看到TextView操作的内容是CharSequence
从继承关系来看,String和Spanned都继承了CharSequence,那么他们俩都可以作为TextView的内容。
那么Spanned到底是什么呢?下面是Spanned的官方解释。
This is the interface for text that has markup objects attached to ranges of it. Not all text classes have mutable markup or text; see Spannable for mutable markup and Editable for mutable text.
Spanned就是在字符序列的基础上添加了一些对象,这些对象就包含html标签里的样式信息,比如html加粗就是Spanned里面包含了new StyleSpan(Typeface.BOLD)这个对象。TextView显示的时候,会通过这些对象设置我们需要的样式。
我们可以通过Html里的方法把这两种字符串相互转化。
五、Demo下载地址