TextView高級用法之SpannableStringBuilder

1.介紹

我們在開發(fā)過程經(jīng)常會遇到一些在TextView上需要顯示不同顏色的文字、文字中加入URL、文件中加入圖片或者對某段文字加入點擊事件等這樣的需求時。我們以前一般的做法是會在一個布局中寫多個控件然后根據(jù)需求來布局XML,這種方法本身沒有什么毛病但是我們可以采用更加好的方案來實現(xiàn)這種需求,現(xiàn)在我們就來學習下SpannableStringBuilder這個類的用法完后就可以優(yōu)雅的實現(xiàn)這類需求了。

  • SpannableStringBuilder 一般配合 SpannableString 使用就和String 和 StringBuilder一樣前者可以拼接后者不能拼接。

  • Class Overview
    This is the class for text whose content and markup can both be changed. /這類文本的內(nèi)容和標記都可以改變/


  • 常用公有方法


    常用公有方法

  • 重點方法 void setSpan(Object what, int start, int end, int flags)
    what 可用于如下圖片中的類
    start 文本開始的位置
    end 文本結束的位置
    flags 是一個標記

Spanned.SPAN_EXCLUSIVE_INCLUSIVE:
在 Span前面輸入的字符不應用 Span的效果,在后面輸入的字符應用Span效果。

Spanned.SPAN_INCLUSIVE_EXCLUSIVE:
在 Span前面輸入的字符應用 Span 的效果,在后面輸入的字符不應用Span效果。

Spanned.SPAN_INCUJSIVE_INCLUSIVE:
在 Span前后輸入的字符都應用 Span 的效果。

what參數(shù)可以作用的類型
what參數(shù)

2.使用過程

 /**
     * 設置文本顏色
     * @param text 需要改變顏色的text
     * @return
     */
    public SpannableString style1(String text) {
        SpannableString sbs = new SpannableString(text);
        ForegroundColorSpan forColor = new ForegroundColorSpan(Color.parseColor("#FF8247"));
        sbs.setSpan(forColor, 0, text.length(), Spanned.SPAN_EXCLUSIVE_EXCLUSIVE);
        return sbs;
    }

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.spannable_layout);
        TextView textView = (TextView) findViewById(R.id.text);
        SpannableStringBuilder builder = new SpannableStringBuilder();
        builder.append(style1("名字:"));
        builder.append("Android TextView中文字通過SpannableString來設置超鏈接、顏色、字體等屬性");
        textView.setText(builder);
    }
改變名字顏色

    /**
     * 設置文本背景顏色
     * @param text 需要改變顏色的text
     * @return
     */
    public SpannableString style2(String text) {
        SpannableString sbs = new SpannableString(text);
        BackgroundColorSpan forColor = new BackgroundColorSpan(Color.parseColor("#FF8247"));
        sbs.setSpan(forColor, 0, text.length(), Spanned.SPAN_EXCLUSIVE_EXCLUSIVE);
        return sbs;
    }
改變背景顏色代碼
改變背景顏色代碼

   /**
     * 在文本中插入image
     * @param text 要改變的text
     * @return
     */
    public SpannableString drawableSpan(String text) {
        SpannableString spannableString = new SpannableString(text);
        ImageSpan drawableSpan = new ImageSpan(this, R.drawable.christmas_diamond);
        //3-5的位置替換為圖片
        spannableString.setSpan(drawableSpan, 3, 5, Spanned.SPAN_EXCLUSIVE_EXCLUSIVE);
        return spannableString;
    }
在文本中插入圖片



    /**
     * 設置文本的點擊
     * @return
     */
    public ClickableSpan clickableSpan() {
        ClickableSpan clickableSpan = new ClickableSpan() {
            @Override
            public void onClick(View widget) {
                Toast.makeText(MainActivity.this, "點擊了URL", Toast.LENGTH_SHORT).show();
            }
        };
        return clickableSpan;
    }

   @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.spannable_layout);
        TextView textView = (TextView) findViewById(R.id.text);
        SpannableStringBuilder builder = new SpannableStringBuilder();
        builder.append(style1("Android TextView"));
        //0-7下標為可以點擊的文本
        builder.setSpan(clickableSpan(), 0, 7, Spanned.SPAN_EXCLUSIVE_INCLUSIVE);
        textView.setText(builder);
        textView.setMovementMethod(LinkMovementMethod.getInstance());//務必加上這句不然沒效果
    }

點擊0-7下標觸發(fā)點擊事件

  /**
   * 設置文本超鏈接
   * @param text 要改變的text
   * @return
   */
  public SpannableString styleUrl(String text) {
      SpannableString spannableString = new SpannableString(text);
      URLSpan urlSpan = new URLSpan(“tel:0123456789”);
      spannableString.setSpan(urlSpan, 0, text.length(), Spanned.SPAN_EXCLUSIVE_EXCLUSIVE);
      return spannableString;
  }

一些最常用的用法就記錄到這,更多的使用可以參考上面圖片中的參數(shù)和方法。

原文鏈接

最后編輯于
?著作權歸作者所有,轉載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務。

相關閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容