Android工作记录整理-控件篇(1)--TextView

Android工作记录整理-控件篇(1)——TextView

0.引文

本文是实用性使用讲解为主,故会忽略部分详细的描述说明。如有需要,会附带一些说明文章的链接。

1.TextView的功能概述

1. 常规文本展示
2. 图文混合展示
3. HTML格式读取展示

1.1 常规文本显示

场景一:TableLayout中的TextView宽度问题
在TableLayout中使用TextView作为最右边列的控件,可能会出现宽度超出屏幕,导致内容显示不全的问题。

处理方法:
使用TextView的权重属性作为宽度限定。

android:layout_width="0dp"
android:layout_weight="1"

PS: EditText可用同样的方法处理

场景二:TextView支持长按复制和搜索功能
一些阅读性的功能,需要对TextView中的文本进行长按弹出系统的文本复制功能。

处理方法:

android:textIsSelectable="true"

注意点:

  1. textIsSelectable属性的源码本质上也是调用了setMovementMethod


    // mInputType should already be EditorInfo.TYPE_NULL and mInput should be null

    setMovementMethod(selectable ? ArrowKeyMovementMethod.getInstance() : null);
    setText(mText, selectable ? BufferType.SPANNABLE : BufferType.NORMAL);

    // Called by setText above, but safer in case of future code changes
    mEditor.prepareCursorControllers();

    延展点:
    TextView的文本滑动功能,会与复制功能冲突。

setMovementMethod(ScrollingMovementMethod.getInstance())

1.2 图文混合展示

图文混合显示其实主要用到了SpannableString类进行富文本操作

SpannableString使用例子

场景一:即时通讯的聊天表情图片
在做社交类APP的时候,通常会遇到在发消息或者文章的时候,需要在文章中插入表情图片。最常见的莫过于QQ和微信的聊天功能和朋友圈了。

处理方法:

  1. 通过key-value将表情资源文件与常量一一对应。
  2. 操作字符串,将字符串中含有的常量查找出来,进行替换操作
  3. 使用ImageSpan将TextView中的常量替换为图片。

表情实现例子

场景二:文本前面带图片标签

场景二效果图

代码实现如下:

tvTxt.setText(new SpannableStringUtils.Builder()
 .append("这是一串很长的标题文字!!!!!")
 .setLeadingMargin(ViewUtil.getViewWidth(ivImg)+ AppUtil.dip2px(2),0)
 .create());

资源链接:SpannableStringUtils工具类

处理方法其实和场景一相似,主要通过使用复合的SpannableString进行设置。

1.3 HTML格式读取展示

许多APP的商品介绍都是通过后端的富文本编辑器进行录入的,同时还有可能插入图片,形成图文说明。而富文本编辑器编辑后的文章在数据库是以HTML格式的字符串存储的,所以在APP接收到的数据也是带有HTML标签的字符串。

此时,我们需要用到Html.fromHtml()方法对带有html标签的字符串进行转化。

Html.fromHtml()(最多参数):

public static Spanned fromHtml(String source, int flags, Html.ImageGetter imageGetter, Html.TagHandler tagHandler) {
  //...
}
  • source:原字符串
  • flags:FROM_HTML_MODE_LEGACY-html块元素之间使用两个换行符分隔
  • ImageGetter:如果存在标签,重写ImageGetter的getDrawable方法对路径进行转化(本地、网络等)。没有则置空
  • TagHandler :存在自定义标签时使用,会在HTML类中被调用。

以下是HTML的img标签存在网络图片的示例代码:

ImageLoaderUtil.downloadDrawableAsync(mContext,paramString,new SimpleTarget<Drawable>() {
@Override
public void onResourceReady(@NonNull Drawable resource, @Nullable Transition<? super Drawable> transition) {

urlDrawable.drawable = resource;
textView.requestLayout();
textView.postInvalidate();
}

});

downloadDrawableAsync方法如下:

public static void downloadDrawableAsync(Context context,String url,SimpleTarget<Drawable> target){
Glide.with(context)
.asDrawable()
.load(url)
.into(target);
}

END

– Nowy

– 2018-10-11

分享到