HTML
private fun setTextStyleWithHtml ( tvTest: TextView) {
val text = "Html,测试<u>下划线</u>、<i>斜体字</i>、<font color='red'>红色字</font>的格式"
tvTest. text = Html. fromHtml ( text)
}
SpannableString
Spanned.SPAN_EXCLUSIVE_EXCLUSIVE等的作用: 用来标识在 Span 范围内的文本前后输入新的字符时是否把它们也应用这个效果。分别有 Spanned.SPAN_EXCLUSIVE_EXCLUSIVE(前后都不包括)、Spanned.SPAN_INCLUSIVE_EXCLUSIVE(前面包括,后面不包括)、Spanned.SPAN_EXCLUSIVE_INCLUSIVE(前面不包括,后面包括)、Spanned.SPAN_INCLUSIVE_INCLUSIVE(前后都包括)。
private fun setTextStyleWithSpan ( tvTest: TextView) {
val msp = SpannableString ( "字体测试字体大小一半两倍前景色背景色正常粗体斜体粗斜体下划线删除线x1x2电话邮件网站短信彩信地图X轴综合" )
msp. setSpan ( TypefaceSpan ( "monospace" ) , 0 , 2 , Spanned. SPAN_EXCLUSIVE_EXCLUSIVE)
msp. setSpan ( TypefaceSpan ( "serif" ) , 2 , 4 , Spanned. SPAN_EXCLUSIVE_EXCLUSIVE)
msp. setSpan ( AbsoluteSizeSpan ( 20 ) , 4 , 6 , Spanned. SPAN_EXCLUSIVE_EXCLUSIVE)
msp. setSpan ( AbsoluteSizeSpan ( 20 , true ) , 6 , 8 , Spanned. SPAN_EXCLUSIVE_EXCLUSIVE)
msp. setSpan ( RelativeSizeSpan ( 0.5f ) , 8 , 10 , Spanned. SPAN_EXCLUSIVE_EXCLUSIVE)
msp. setSpan ( RelativeSizeSpan ( 2.0f ) , 10 , 12 , Spanned. SPAN_EXCLUSIVE_EXCLUSIVE)
msp. setSpan ( ForegroundColorSpan ( Color. MAGENTA) , 12 , 15 , Spanned. SPAN_EXCLUSIVE_EXCLUSIVE)
msp. setSpan ( BackgroundColorSpan ( Color. CYAN) , 15 , 18 , Spanned. SPAN_EXCLUSIVE_EXCLUSIVE)
msp. setSpan ( StyleSpan ( Typeface. NORMAL) , 18 , 20 , Spanned. SPAN_EXCLUSIVE_EXCLUSIVE)
msp. setSpan ( StyleSpan ( Typeface. BOLD) , 20 , 22 , Spanned. SPAN_EXCLUSIVE_EXCLUSIVE)
msp. setSpan ( StyleSpan ( Typeface. ITALIC) , 22 , 24 , Spanned. SPAN_EXCLUSIVE_EXCLUSIVE)
msp. setSpan ( StyleSpan ( Typeface. BOLD_ITALIC) , 24 , 27 , Spanned. SPAN_EXCLUSIVE_EXCLUSIVE)
msp. setSpan ( UnderlineSpan ( ) , 27 , 30 , Spanned. SPAN_EXCLUSIVE_EXCLUSIVE)
msp. setSpan ( StrikethroughSpan ( ) , 30 , 33 , Spanned. SPAN_EXCLUSIVE_EXCLUSIVE)
msp. setSpan ( SubscriptSpan ( ) , 34 , 35 , Spanned. SPAN_EXCLUSIVE_EXCLUSIVE)
msp. setSpan ( SuperscriptSpan ( ) , 36 , 37 , Spanned. SPAN_EXCLUSIVE_EXCLUSIVE)
msp. setSpan ( URLSpan ( "tel:4155551212" ) , 37 , 39 , Spanned. SPAN_EXCLUSIVE_EXCLUSIVE)
msp. setSpan ( ForegroundColorSpan ( Color. BLUE) , 37 , 39 , Spanned. SPAN_EXCLUSIVE_EXCLUSIVE)
msp. setSpan ( URLSpan ( "mailto:webmaster@google.com" ) , 39 , 41 , Spanned. SPAN_EXCLUSIVE_EXCLUSIVE)
msp. setSpan ( ForegroundColorSpan ( Color. YELLOW) , 39 , 41 , Spanned. SPAN_EXCLUSIVE_EXCLUSIVE)
msp. setSpan ( URLSpan ( "http://www.baidu.com" ) , 41 , 43 , Spanned. SPAN_EXCLUSIVE_EXCLUSIVE)
msp. setSpan ( ForegroundColorSpan ( Color. GREEN) , 41 , 43 , Spanned. SPAN_EXCLUSIVE_EXCLUSIVE)
msp. setSpan ( URLSpan ( "sms:4155551212" ) , 43 , 45 , Spanned. SPAN_EXCLUSIVE_EXCLUSIVE)
msp. setSpan ( ForegroundColorSpan ( Color. RED) , 43 , 45 , Spanned. SPAN_EXCLUSIVE_EXCLUSIVE)
msp. setSpan ( URLSpan ( "mms:4155551212" ) , 45 , 47 , Spanned. SPAN_EXCLUSIVE_EXCLUSIVE)
msp. setSpan ( ForegroundColorSpan ( Color. CYAN) , 45 , 47 , Spanned. SPAN_EXCLUSIVE_EXCLUSIVE)
msp. setSpan ( URLSpan ( "geo:38.899533,-77.036476" ) , 47 , 49 , Spanned. SPAN_EXCLUSIVE_EXCLUSIVE)
msp. setSpan ( ScaleXSpan ( 2.0f ) , 49 , 51 , Spanned. SPAN_EXCLUSIVE_EXCLUSIVE)
tvTest. text = msp
tvTest. movementMethod = LinkMovementMethod. getInstance ( ) ;
}
自定义Span
public class CustomUrlSpan extends URLSpan {
private final String title;
public CustomUrlSpan ( String url, String title) {
super ( url) ;
this . title = title;
}
@Override
public void updateDrawState ( @NonNull TextPaint ds) {
ds. setColor ( ds. linkColor) ;
ds. setUnderlineText ( false ) ;
}
@Override
public void onClick ( View widget) {
String url = getURL ( ) ;
Intent intent = new Intent ( getContext ( ) , CommonWebViewActivity. class) ;
intent. putExtra ( EXTRA_URL, url) ;
intent. putExtra ( EXTRA_TITLE, title) ;
startActivity ( intent) ;
}
}
SpannableStringBuilder可以用于拼接SpannableString
private fun initBottomAgreement ( isShowRegisterText: Boolean) {
var defaultText = "本人已阅读并同意"
if ( isShowRegisterText) {
defaultText = "新用户首次登录将会直接注册账号\n本人已阅读并同意"
}
val sp1 = SpannableString ( " 用户协议 " )
sp1. setSpan ( CustomUrlSpan ( "https://test.im/app/member-policy.html" , "用户协议" ) , 0 , sp1. length, Spannable. SPAN_EXCLUSIVE_EXCLUSIVE)
sp1. setSpan ( ForegroundColorSpan ( Color. BLACK) , 0 , sp1. length, Spannable. SPAN_EXCLUSIVE_EXCLUSIVE)
val sp2 = SpannableString ( " 隐私协议 " )
sp2. setSpan ( CustomUrlSpan ( "https://test.im/datastory/privacy/privacy.html" , "隐私协议" ) , 0 , sp2. length, Spannable. SPAN_EXCLUSIVE_EXCLUSIVE)
sp2. setSpan ( ForegroundColorSpan ( Color. BLACK) , 0 , sp2. length, Spannable. SPAN_EXCLUSIVE_EXCLUSIVE)
val ssp = SpannableStringBuilder ( defaultText)
ssp. append ( sp1)
ssp. append ( SpannableString ( "和" ) )
ssp. append ( sp2)
binding. tvBottomAgreement. text = ssp
binding. tvBottomAgreement. movementMethod = LinkMovementMethod. getInstance ( )
}
Spannable.SPAN_EXCLUSIVE_EXCLUSIVE
参考资料