在实际开发中经常会遇到一个字符串根据内容需要显示不同颜色的需求来对某个关键字进行突出。
如果是这样的需求,其实也很简单,很自然的就会想到写两个横向布局的TextView,分别对TextView的颜色进行不同的配置就好了。那如果是下面这样呢?
顺着上面的思路,写三个TextView,so easy!!!
下面我们来看一下如何使用一个TextView来实现这种效果。首先在string.xml中定义如下格式的字符串:
<string name="test_msg" formatted="true><Data><![CDATA[<font color="#000000"><b>%1$s</b></font><font color="#197cf6"><b>%2$s</b></font>]]></Data></string>
其中一个<font color="#000000"><b>%1$s</b></font>就表示要对你的文字的颜色进行设定。
如果要是有两种以上的颜色,那么只需要多加一个<font>标签就可以了,例如:
<string name="test_msg" formatted="true"><Data><![CDATA[<font color="#000000"><b>%1$s</b></font><font color="#ff0000"><b>%2$s</b></font><font color="#000000"><b>%3$s</b></font>]]></Data></string>
在两个不同的<font>标签之中还可以插入一些文字,例如一些固定写死的:
<string name="test_msg" formatted="true"><Data><![CDATA[尊敬的<font color="#00ff00"><b>%1$s</b></font>用户,恭喜您抽中<font color="#ff0000"><b>%2$s</b></font>大奖]]></Data></string>
下面我们只需要在代码中添加如下代码就可以一个TextView实现这种需求:
String format = String.format(getResources().getString(R.string.test_msg), "王二狗", "免费大宝剑");
tv.setText(Html.fromHtml(format));
除了可以对颜色进行配置,就连文字大小等也都是可以改变的:
<string name="test_msg" formatted="true"><Data><![CDATA[尊敬的<font color="#00ff00"><big><big><big><b>%1$s</b></big></big></big></font>用户,恭喜您抽中<font color="#ff0000"><big><big><big><b>%2$s</b></big></big></big></font>大奖]]></Data></string>
在<font>中嵌套<big>标签就可以改变文字大小。如果<big>标签的数量越多,文字就越大。
最后,如果你使用的是Databinding在xml中引入string资源进行文字格式化的时候,如果一直报错,你可能需要这样做:
@androidx.databinding.BindingAdapter({"android:htmlText"})
public static void setHtmlTextValue(TextView textView, String htmlText) {
if (htmlText == null)
return;
Spanned result;
if (android.os.Build.VERSION.SDK_INT >= android.os.Build.VERSION_CODES.N) {
result = Html.fromHtml(htmlText, Html.FROM_HTML_MODE_LEGACY);
} else {
result = Html.fromHtml(htmlText);
}
textView.setText(result);
}
然后再xml中就可以直接这样使用:
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_gravity="center"
android:htmlText="@{@string/test_msg(user.name,user.award)}"
android:textColor="@color/text_white"
android:textSize="28sp"/>
其中user可能就是服务器返回的数据,我们只需要把其中的字段取出来就可以了。
网友评论