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);
        }
    }
}





你可能感兴趣的:(Android基础)