根據項目需求使用一個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並實現onClick與updateDrawState兩個方法;一個是點擊事件的方法,一個可以改變文字顏色,並且源代碼裏面告訴我們,如果使用這個類,就一個要使用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); } } }