TextView部分文字變色並可點擊

根據項目需求使用一個TextView顯示一段文字,但是部分文字的顏色要有所區別,並且不同顏色的文字點擊相應不同的點擊事件

1.使用SpannableStringBuilder ,從名字就可以看出他是一個內容和標記都可以更改的文本類.我們主要使用他的setSpan(Object what, int start, int end, int flags)改變文本樣式。

對應的參數:

  • start: 指定Span的開始位置
  • end: 指定Span的結束位置,並不包括這個位置。
  • flags:取值有如下四個
    • Spannable.SPAN_EXCLUSIVE_INCLUSIVE:在 Span前面輸入的字符不應用 Span的效果,在後面輸入的字符應用Span效果。
    • Spannable.SPAN_INCLUSIVE_EXCLUSIVE:在 Span前面輸入的字符應用 Span 的效果,在後面輸入的字符不應用Span效果。
    • Spannable.SPAN_INCUJSIVE_INCLUSIVE:在 Span前後輸入的字符都應用 Span 的效果。
    • Spannable.SPAN_EXCLUSIVE_EXCLUSIVE:前後都不包括。
  • what: 對應的各種Span,不同的Span對應不同的樣式。已知的可用類有:
    • BackgroundColorSpan : 文本背景色
    • ForegroundColorSpan : 文本顏色
    • MaskFilterSpan : 修飾效果,如模糊(BlurMaskFilter)浮雕
    • RasterizerSpan : 光柵效果
    • StrikethroughSpan : 刪除線
    • SuggestionSpan : 相當於佔位符
    • UnderlineSpan : 下劃線
    • AbsoluteSizeSpan : 文本字體(絕對大小)
    • DynamicDrawableSpan : 設置圖片,基於文本基線或底部對齊。
    • ImageSpan : 圖片
    • RelativeSizeSpan : 相對大小(文本字體)
    • ScaleXSpan : 基於x軸縮放
    • StyleSpan : 字體樣式:粗體、斜體等
    • SubscriptSpan : 下標(數學公式會用到)
    • SuperscriptSpan : 上標(數學公式會用到)
    • TextAppearanceSpan : 文本外貌(包括字體、大小、樣式和顏色)
    • TypefaceSpan : 文本字體
    • URLSpan : 文本超鏈接
    • ClickableSpan : 點擊事件

2.繼承ClickableSpan並實現onClickupdateDrawState個方法;一個是點擊事件的方法,一個可以改變文字顏色,並且源代碼裏面告訴我們,如果使用這個類,就一個要使用TextView.setMovementMethod(LinkMovementMethod.getInstance());源代碼也非常簡單,感興趣的可以看一下

3.TextView中的setHighlightColor(int color)用於設置選中文字背景色高亮顯示

下面就是代碼部分了:

public class MainActivity extends AppCompatActivity {

    private TextView mContent;
    private String firstText="今天";
    private String contentText = "今天是個好日子";

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        mContent = findViewById(R.id.text_content);
        mContent.setText(contentText);

        //去掉點擊後的背景色
        mContent.setHighlightColor(getResources().getColor(android.R.color.transparent));
        SpannableStringBuilder spannable = new SpannableStringBuilder(contentText);
        //文字點擊
        spannable.setSpan(new firstClick(),0,firstText.length()
                , Spannable.SPAN_EXCLUSIVE_EXCLUSIVE);
        spannable.setSpan(new secondClick(), firstText.length()+2,contentText.length()
                , Spannable.SPAN_EXCLUSIVE_EXCLUSIVE);
        //一定要記得設置,不然點擊不生效
        mContent.setMovementMethod(LinkMovementMethod.getInstance());
        mContent.setText(spannable);
    }

    private class firstClick extends ClickableSpan {

        @Override
        public void onClick(View widget) {
            Toast.makeText(MainActivity.this,"今天",Toast.LENGTH_SHORT).show();
        }

        @Override
        public void updateDrawState(TextPaint ds) {
            ds.setColor(Color.RED);
        }
    }

    private class secondClick extends ClickableSpan {

        @Override
        public void onClick(View widget) {
            Toast.makeText(MainActivity.this, "好日子", Toast.LENGTH_SHORT).show();
        }

        @Override
        public void updateDrawState(TextPaint ds) {
            ds.setColor(Color.BLUE);
        }
    }
}





發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章