Android Spannable 使用注意事项

1、当前示例中间的 "评论 ",使用SpannableStringBuilder实现,点击评论会有高亮效果加粗,但再点击其它Bar时无法恢复默认样式。

2、因为SpannableString或SpannableStringBuilder中的效果是叠加 的,恢复默认样式需要先移除 加粗样式 spannable.removeSpan(样式)。

3、示例代码

// 样式是叠加的,所以要清除之前的样式 spannableStringBuilder.removeSpan(highlightSpanColor);

spannableStringBuilder.removeSpan(highlightSpanStyle);

java 复制代码
private SpannableStringBuilder spannableStringBuilder;


    // 评论 默认样式

    // 字体颜色
    ForegroundColorSpan defaultSpanColor = new ForegroundColorSpan(getResources().getColor(com.lstm.baselibrary.R.color.color_606266,null));

    // 字体大小
    AbsoluteSizeSpan defaultSpanSize = new AbsoluteSizeSpan(DisplayUtils.dp2px(getContext(), 15));

    // 字体样式
    StyleSpan defaultSpanStyle = new StyleSpan(Typeface.NORMAL);


    // 评论 高亮样式

    // 字体颜色
    ForegroundColorSpan highlightSpanColor = new ForegroundColorSpan(getResources().getColor(com.lstm.baselibrary.R.color.color_303133,null));

    // 字体样式
    StyleSpan highlightSpanStyle = new StyleSpan(Typeface.BOLD); // 字体加粗


    // 评论数量 样式

    // 字体颜色
    ForegroundColorSpan countColor = new ForegroundColorSpan(getResources().getColor(com.lstm.baselibrary.R.color.color_909399, null));

    // 字体大小
    AbsoluteSizeSpan countSize = new AbsoluteSizeSpan(DisplayUtils.dp2px(getContext(), 12));

    /**
     * 不同样式拼接 默认样式
     */
    private void splicingDefaultTextStyle() {
        spannableStringBuilder = new SpannableStringBuilder(getText());

        // 评论
        spannableStringBuilder.removeSpan(highlightSpanColor); // 样式是叠加的,所以要清除之前的样式
        spannableStringBuilder.removeSpan(highlightSpanStyle);

        spannableStringBuilder.setSpan(defaultSpanColor, 0, 2, Spanned.SPAN_INCLUSIVE_INCLUSIVE); // 字体颜色
        spannableStringBuilder.setSpan(defaultSpanSize, 0, 2, Spanned.SPAN_INCLUSIVE_INCLUSIVE); // 字体大小
        spannableStringBuilder.setSpan(defaultSpanStyle, 0, 2, Spanned.SPAN_INCLUSIVE_INCLUSIVE); // 字体样式

        // 评论数量
        spannableStringBuilder.setSpan(countColor, 2, getText().length(), Spanned.SPAN_INCLUSIVE_INCLUSIVE); // 字体颜色
        spannableStringBuilder.setSpan(countSize, 2, getText().length(), Spanned.SPAN_INCLUSIVE_INCLUSIVE); // 字体大小
        spannableStringBuilder.setSpan(defaultSpanStyle, 2, getText().length(), Spanned.SPAN_INCLUSIVE_INCLUSIVE); // 字体样式

        setText(spannableStringBuilder);
    }

    /**
     * 不同样式拼接 高亮样式
     */
    private void splicingHighlightTextStyle() {
        spannableStringBuilder = new SpannableStringBuilder(getText());

        // 评论
        spannableStringBuilder.removeSpan(defaultSpanColor); // 样式是叠加的,所以要清除之前的样式
        spannableStringBuilder.removeSpan(defaultSpanStyle);

        spannableStringBuilder.setSpan(highlightSpanColor, 0, 2, Spanned.SPAN_INCLUSIVE_INCLUSIVE); // 字体颜色
        spannableStringBuilder.setSpan(defaultSpanSize, 0, 2, Spanned.SPAN_INCLUSIVE_INCLUSIVE); // 字体大小
        spannableStringBuilder.setSpan(highlightSpanStyle, 0, 2, Spanned.SPAN_INCLUSIVE_INCLUSIVE); // 字体样式

        // 评论数量
        spannableStringBuilder.setSpan(countColor, 2, getText().length(), Spanned.SPAN_INCLUSIVE_INCLUSIVE); // 字体颜色
        spannableStringBuilder.setSpan(countSize, 2, getText().length(), Spanned.SPAN_INCLUSIVE_INCLUSIVE); // 字体大小
        spannableStringBuilder.setSpan(defaultSpanStyle, 2, getText().length(), Spanned.SPAN_INCLUSIVE_INCLUSIVE); // 字体样式

        setText(spannableStringBuilder);
    }
相关推荐
胖虎11 小时前
Android 入门到实战(三):ViewPager及ViewPager2多页面布局
android·viewpager·viewpager2
风往哪边走3 小时前
Media3在线本地视频播放器
android
激昂网络3 小时前
android kernel代码 common-android13-5.15 下载 编译
android·大数据·elasticsearch
Monkey-旭3 小时前
Android 人脸识别技术全解析
android·android 人脸识别·ml kit 实战·活体检测技术·人脸识别性能优化·人脸考勤系统·移动端人脸特征提取
vivo互联网技术3 小时前
桌面挂件不能承受之重——GIF
android·gif加载·桌面挂件
JulyYu4 小时前
Android系统保存重名文件后引发的异常解决
android·操作系统·源码
叽哥4 小时前
Kotlin学习第 2 课:Kotlin 基础语法:掌握变量、数据类型与运算符
android·kotlin·app
tangweiguo030519874 小时前
Android原生(Kotlin)与Flutter混合开发 - 设备控制与状态同步解决方案
android·flutter
安卓开发者6 小时前
驾驭复杂表单:用 RxJava 实现响应式表单处理
android·rxjava