前言
本篇介绍一下在Android开发过程中使用最多的一个控件-TextView
,实现简单的图片加载显示及链接处理。
如果你说:没有用过ConstraintLayout
、FloatingActionButton
、TabLayout
等等,那也没多大事。但是如果说你没有用过TextView
,那就得佩服你了。
先上效果:
TextView 家族
1 | Targets |
与TextView
有着直接或间接继承关系的有27个,如上述所示。
TextView
的父类为View
。
TextView常用的xml属性及相关方法
TextView的属性有许多,下表展示了部分属性。
xml属性 | 相关方法 | 说明 |
---|---|---|
android:autoLink | setAutoLinkMask(int) | 是否将符合指定格式的文本转换为可单击的超链接形式 |
android:autoText | setKeyLinstener(KeyLinstener) | 控制是否将的URL、email等地址自动转换为可单击的链接 |
android:linksClickable | setLinksClickable(boolean) | 控制该文本框的URL、email等链接是否具可以点击 |
android:capitalize | setKeyLinstener(KeyLinstener) | 控制是否将用户输入的文本转换为大写字母 |
android:cursorVisible | setCursorVisiblek(boolean) | 设置该文本框的光标是否可见 |
android:drawableBottom | setCompoundDrawablesWithIntrinsicBounds(Drawable,Drawable,Drawable,Drawable) | 在文本框底端处绘制图像 |
android:drawableTop | setCompoundDrawablesWithIntrinsicBounds(Drawable,Drawable,Drawable,Drawable) | 在文本框顶端处绘制图像 |
android:drawableEnd | setCompoundDrawablesWithIntrinsicBounds(Drawable,Drawable,Drawable,Drawable) | 在文本框结尾处绘制图像 |
android:drawableLeft | setCompoundDrawablesWithIntrinsicBounds(Drawable,Drawable,Drawable,Drawable) | 在文本框左边处绘制图像 |
android:drawableRight | setCompoundDrawablesWithIntrinsicBounds(Drawable,Drawable,Drawable,Drawable) | 在文本框右边处绘制图像 |
android:drawablePadding | setCompoundDrawablesWithIntrinsicBounds(Drawable,Drawable,Drawable,Drawable) | 设置文本框内文本与图形的间距 |
android:drawableStart | setCompoundDrawablesWithIntrinsicBounds(Drawable,Drawable,Drawable,Drawable) | 在文本框开始处绘制图像 |
android:editable | 设置文本框是否允许被编辑 | |
android:ellipsize | setEllipsize(TextUitls,TruncateAt) | 当显示文本超过了TextView的宽度时,如何处理文本 |
android:ems | setEms(int) | 设置文本框的宽度 |
android:height | setHeight(int) | 设置文本框的高度 |
android:fontFamily | setTypeface(Typeface) | 设置文本框内文本的字体 |
android:gravity | setGravity(int) | 设置文本框内文本的对齐方式 |
android:hint | setHint(int) | 设置文本框内容为空时,文本框内默认显示的提示文字 |
android:inputType | setRawInputType(int) | 设置文本框输入方式 |
android:lines | setLines(int) | 设置文本框默认占几行 |
android:maxEms | setMaxEms(int) | 设置文本框最大宽度 |
android:maxHeight | setMaxHeight(int) | 设置文本框最大高度 |
android:maxLenghth | setMaxLenghth(int) | 设置文本框最大字符长度 |
android:maxWidth | setMaxWidth(int) | 设置文本框最大宽度 |
android:maxLines | setMaxLines(int) | 设置文本框最多占几行 |
android:maxEms | setMaxEms(int) | 设置文本框最小宽度 |
android:minHeight | setMinHeight(int) | 设置文本框最小高度 |
android:minLenghth | setMinxLenghth(int) | 设置文本框最小长度 |
android:minWidth | setMinWidth(int) | 设置文本框最小宽度 |
android:minLines | setMinLines(int) | 设置文本框最少占几行 |
android:passwordd | setTransformatinMethod(TransformatinMethod) | 设置文本框是一个密码框 |
android:phoneNumber | setKeyListener(KeyListener) | 设置文本框只接受电话号码 |
android:scrollHorizontally | setHorizontallyScrolling(boolean) | 设置文本框不够显示全部内容时是否允许水平滚动 |
android:selectAllOnFocus | setSelectAllOnFocus(boolean) | 如果文本框内的内容可选择,设置是否当它获得焦点时自动选择所有文本 |
android:shawdowColor | setshadowLayer(float,float,float,int) | 设置文本框内文本的阴影的颜色 |
android:shawdowDx | setshadowLayer(float,float,float,int) | 设置文本框内文本的阴影在水平方向的偏移 |
android:shawdowDy | setshadowLayer(float,float,float,int) | 设置文本框内文本的阴影在垂直方向的偏移 |
android:shawdowRadius | setshadowLayer(float,float,float,int) | 设置文本框内文本的阴影的模糊程度,值越大,阴影越模糊 |
android:singleLine | setTransformationMethod() | 设置文本框是否为单行模式 |
android:text | setText(CharSequence) | 设置是否将文本框文本的内容 |
android:textAllCaps | setAllCaps(boolean) | 设置是否将文本框中所有字幕显示为大写字母 |
android:textAppearance | 设置文本框的颜色、字体、大小等样式 | |
android:textColor | setTextColor(ColorStateList) | 设置文本框中文本的颜色 |
android:textColorHighlight | setHighlightColor(int) | 设置文本框被选中时的颜色 |
android:textColorHint | setHintTextColor(int) | 设置文本框中提示文本的颜色 |
android:textColorLink | setLinkTextColor(int) | 设置文本框中链接的颜色 |
android:textIsSelectable | setTextSelectedable() | 设置该文本框不能编辑时,文本框内的文本是否可以被选中 |
android:textSize | setTextSize(float) | 设置文本框的字体大小 |
android:textStyle | setTypeface(Typeface) | 设置文本框内字体风格,如粗体、斜体等 |
android:width | setWidth(int) | 设置该文本框的宽度 |
加载图片
1 | TextView.setText(CharSequence text) |
由于TextView.setText
传入的是CharSequence
类型,那就可以配合CharSequence的子类Spanned
及Html.fromHtml
方法实现图片加载显示的功能。
具体的代码也很简单
1
2
3//使用Html.fromHtml解析标签,
//asyncImageGetter用于加载img标签图片资源
Spanned spanned = Html.fromHtml(text, asyncImageGetter, null);
1 | public interface OnImageClickListener { |
1 | /** |
asyncImageGetter
为Html.ImageGetter
接口的一个实例,用于加载文本中的图片。
实现其中getDrawable
方法,该方法的参数String source
为img
标签上的图片地址。
我这边使用了Universal Image Loader去加载图片。
设置图片点击回调
这个有点问题,请大家帮忙解决下。
就是点击图片的位置position不正确。
代码如下:
1 | SpannableStringBuilder spannableStringBuilder; |
1 | //获取img标签,设置图片的点击事件及回调 |
先将加载图片-fromHtml中返回的spanned
转成SpannableStringBuilder
,用以添加点击回调ClickableSpan
。
之后便是从spannableStringBuilder
中获取img标签,设置图片的点击事件及回调。
代码中也写了部分注释,便于理解。
这段代码就是会产生点击图片回调的position会错位,请大神们帮忙看看。
设置链接点击事件及回调
1 | public interface OnUrlClickListener { |
1 | //获取a标签,设置点击事件及回调 |
URLSpan源码
1 | public class URLSpan extends ClickableSpan implements ParcelableSpan { |
完整代码
1 | <pre> |
代码
推荐
最后推荐一个不错的富文本框架
Android平台下的富文本解析器,支持Html和Markdown