自定义TextView

首先我们看下设计图,下图是一个评论的列表,只截取了一部分来参考:
image
粗略的看下每条评论都由头像,昵称以及评论组成,貌似一个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 + "&nbsp;&nbsp;&nbsp;&nbsp;" + 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);
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值