需要背景:android应用在用户注册时需要显示的声明用户协议和隐藏权政策,其中字体有普通模式、加粗、下划线等,并且同一行的情况就存在不同的样式,需求如下图:
对于该需求,肯定是用TextView来解决,并且必须是同一个TextView。
不绕弯子,直接上解决方案。——使用Spannable接口的SpannableString实现类。
参考文献:https://blog.csdn.net/q4878802/article/details/49757847
mMainTv = (TextView)findViewById(ResourceUtil.getId(mContext, "sso_dialog_textview"));
Spannable spannableString = new SpannableString("在您注册的过程中," +
"您需要完成注册流程并确认同意在线签署协议》和" +
"(以下简称“法律文件”)。" +
"请您在确认同意之前务必仔细阅读、充分理解法律文件中的条款内容,尤其是在法律文件中以粗体或下划线标识的条款部分." +
"\n\n如果您不同意上述法律文件或其中的任何条款约定,请您停止注册。如您按照注册流程提示填写信息、阅读并确认同意上述法律文件且完成注册流程后," +
"即表示您已充分阅读、理解并接受上述法律文件的全部内容;并表以依据法律文件约定来处理您的个人信息。");
StyleSpan(Typeface.BOLD),0,spannableStringBuilder.length(), Spanned.SPAN_INCLUSIVE_INCLUSIVE);
spannableString.setSpan(new StyleSpan(Typeface.BOLD), 66, spannableString.length(), Spannable.SPAN_INCLUSIVE_INCLUSIVE);
spannableString.setSpan(new URLSpan(""), 66, spannableString.length(), Spannable.SPAN_EXCLUSIVE_EXCLUSIVE);
spannableString.setSpan(new ForegroundColorSpan(ResourceUtil.getColorId(mContext,"sso_color_hint_text_white")), 66, spannableString.length(), Spannable.SPAN_EXCLUSIVE_EXCLUSIVE);
mMainTv.setText(spannableString);
上述简单的一参考文献就解决了该问题,记录下。
分割线下面是对Spannable的理解()
参考文献:https://blog.csdn.net/lyh916/article/details/49183739
常用的常量:控制起始、终点的ID号,即方法中的第二、第三个参数
SPAN_EXCLUSIVE_EXCLUSIVE 不包括前面,不包括后面
SPAN_EXCLUSIVE_INCLUSIVE 不包括前面,包括后面
SPAN_INCLUSIVE_EXCLUSIVE 包括前面,不包括后面
SPAN_INCLUSIVE_INCLUSIVE 包括前面,包括后面
/**
* 超链接
*/
private void addUrlSpan() {
SpannableString spanString = new SpannableString("超链接");
URLSpan span = new URLSpan("tel:0123456789");
spanString.setSpan(span, 0, 3, Spannable.SPAN_EXCLUSIVE_EXCLUSIVE);
tv1.setText(spanString);
}
/**
* 文字背景颜色
*/
private void addBackColorSpan() {
SpannableString spanString = new SpannableString("背景色");
BackgroundColorSpan span = new BackgroundColorSpan(Color.YELLOW);
spanString.setSpan(span, 0, 3, Spannable.SPAN_EXCLUSIVE_EXCLUSIVE);
tv2.setText(spanString);
}
/**
* 文字颜色
*/
private void addForeColorSpan() {
SpannableString spanString = new SpannableString("字体色");
ForegroundColorSpan span = new ForegroundColorSpan(Color.BLUE);
spanString.setSpan(span, 0, 3, Spannable.SPAN_EXCLUSIVE_EXCLUSIVE);
tv3.setText(spanString);
}
/**
* 字体大小
*/
private void addFontSpan() {
SpannableString spanString = new SpannableString("36号字体");
AbsoluteSizeSpan span = new AbsoluteSizeSpan(36);
spanString.setSpan(span, 0, 5, Spannable.SPAN_EXCLUSIVE_EXCLUSIVE);
tv4.setText(spanString);
}
/**
* 粗体,斜体
*/
private void addStyleSpan() {
SpannableString spanString = new SpannableString("BIBI");
StyleSpan span = new StyleSpan(Typeface.BOLD_ITALIC);
spanString.setSpan(span, 0, 2, Spannable.SPAN_EXCLUSIVE_EXCLUSIVE);
tv5.setText(spanString);
}
/**
* 删除线
*/
private void addStrikeSpan() {
SpannableString spanString = new SpannableString("删除线");
StrikethroughSpan span = new StrikethroughSpan();
spanString.setSpan(span, 0, 3, Spannable.SPAN_EXCLUSIVE_EXCLUSIVE);
tv6.setText(spanString);
}
/**
* 下划线
*/
private void addUnderLineSpan() {
SpannableString spanString = new SpannableString("下划线");
UnderlineSpan span = new UnderlineSpan();
spanString.setSpan(span, 0, 3, Spannable.SPAN_EXCLUSIVE_EXCLUSIVE);
tv7.setText(spanString);
}
/**
* 图片
*/
private void addImageSpan() {
SpannableString spanString = new SpannableString(" ");
Drawable d = getResources().getDrawable(R.drawable.ic_launcher);
d.setBounds(0, 0, d.getIntrinsicWidth(), d.getIntrinsicHeight());
ImageSpan span = new ImageSpan(d, ImageSpan.ALIGN_BASELINE);
spanString.setSpan(span, 0, 1, Spannable.SPAN_EXCLUSIVE_EXCLUSIVE);
tv8.setText(spanString);
}
/**
* 混合
*/
private void addConbine() {
SpannableStringBuilder spannable = new SpannableStringBuilder("组合运用啊");
CharacterStyle span1 = new BackgroundColorSpan(Color.BLUE);
CharacterStyle span2 = new ForegroundColorSpan(Color.RED);
spannable.setSpan(span1, 0, 2, Spannable.SPAN_EXCLUSIVE_EXCLUSIVE);
spannable.setSpan(span2, 2, 4, Spannable.SPAN_EXCLUSIVE_EXCLUSIVE);
tv9.setText(spannable);
}
//需要处理的文本,[smile]是需要被替代的文本
String content = editText.getText().toString();
SpannableString spannable = new SpannableString(content + "[smile]");
//要让图片替代指定的文字就要用ImageSpan
ImageSpan span = new ImageSpan(drawable, ImageSpan.ALIGN_BASELINE);
//开始替换,注意第2和第3个参数表示从哪里开始替换到哪里替换结束(start和end)
//最后一个参数类似数学中的集合,[5,12)表示从5到12,包括5但不包括12
spannable.setSpan(span, content.length(), content.length() + "[smile]".length(), Spannable.SPAN_INCLUSIVE_EXCLUSIVE);
在界面中设置样式
<TextView
android:id="@+id/txt6"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="在布局文件中设置斜体加斜体字"
android:textColor="#FE7E00"
android:textSize="16sp"
android:textStyle="italic|bold" />