首先我们看下设计图,下图是一个评论的列表,只截取了一部分来参考:
粗略的看下每条评论都由头像,昵称以及评论组成,貌似一个ImageView和一、两个TextView就能搞定。但是仔细一看的话昵称是橙色的,后面的评论字体又是黑色的,而且评论有多行的话后面的是要和昵称左对齐的,所以两个TextView肯定是不可以的,所以我们就需要封装一个设计师需要的这种形式的TextView。
首先我们需要定义自定义控件的属性,在attrs.xml中声明一个名为ColorTextView的属性集,该属性集暂时包含name和comment属性,如下所示:
<declare-styleable name="ColorTextView">
<attr name="name" format="string" />
<attr name="comment" format="string" />
</declare-styleable>
然后继承TextView实现ColorTextView,因为在布局中需要用到该自定义的控件,所以需要复写2个和3个参数的构造函数,代码如下:
package com.cooloongwu.coolview.view;
import android.content.Context;
import android.content.res.TypedArray;
import android.support.annotation.Nullable;
import android.text.Html;
import android.util.AttributeSet;
import android.util.Log;
import com.cooloongwu.coolview.R;
/**
* 自定义包含不同颜色字的TextView
* Created by CooLoongWu on 2018-3-16 14:38.
*/
public class ColorTextView extends android.support.v7.widget.AppCompatTextView {
public ColorTextView(Context context) {
super(context);
}
public ColorTextView(Context context, @Nullable AttributeSet attrs) {
this(context, attrs, 0);
}
public ColorTextView(Context context, @Nullable AttributeSet attrs, int defStyleAttr) {
super(context, attrs, defStyleAttr);
init(context, attrs, defStyleAttr);
}
private void init(Context context, AttributeSet attrs, int defStyleAttr) {
TypedArray typedArray = context.obtainStyledAttributes(
attrs,
R.styleable.ColorTextView,
defStyleAttr,
0
);
String name = typedArray.getString(R.styleable.ColorTextView_name);
String comment = typedArray.getString(R.styleable.ColorTextView_comment);
Log.e("name", name);
Log.e("comment", comment);
//方法一:使用Html的方式来定义字体颜色
String colorName = "<font color = '#fc873d'>" + name + "</font>";
String colorComment = "<font color = '#323232'>" + comment + "</font>";
setText(Html.fromHtml(colorName + " " + colorComment));
typedArray.recycle();
}
}
在xml布局中使用该控件:
<com.cooloongwu.coolview.view.ColorTextView
android:layout_width="match_parent"
android:layout_height="match_parent"
android:textSize="16sp"
app:comment="依然近日,全国盛会在京隆重召开。作为国家战略中的新兴产业风口,中国新能源汽车销量雄踞全球首位,成为备受关注和期待的议题。"
app:name="六八二" />
方法一
在上面的自定义代码中我们通过TypedArray来获取到xml布局中ColorTextView控件的各个值,然后使用html的方式给name和comment加了颜色然后拼接在一起,最后使用Html.fromHtml()来将拼接好后的字符串赋值给TextView。这样就实现了我们上述的效果。
方法二
这里我们要使用到SpannableStringBuilder类,这是一个内容和标记都可以更改的文本类,用这个类我们可以实现对字符串的各种自定义,具体的使用方法请自行查看API。下面是要实现我们所需效果的部分代码。
//方法二:使用SpannableString
SpannableStringBuilder s = new SpannableStringBuilder(name);
s.setSpan(
new ForegroundColorSpan(Color.parseColor("#fc873d")),
0,
s.length(),
Spanned.SPAN_EXCLUSIVE_EXCLUSIVE);
s.append(comment);
setText(s);