TextView中字体的多样化设置——SpannableString

版权声明:出于感谢(如果有收获)或对知识的尊重,未经允许禁止转载 https://blog.csdn.net/bendan50/article/details/81514197

需要背景: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" />

猜你喜欢

转载自blog.csdn.net/bendan50/article/details/81514197