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);
    }
相关推荐
帅次1 分钟前
Android 17 开发者实战:核心更新与应用场景落地指南
android·java·ios·android studio·iphone·android jetpack·webview
大鹏说大话13 分钟前
SQL 排序与分组实战:解决“分组后取最新数据“
android·java·数据库
搜狐技术产品小编20233 小时前
破局与重构:纯端侧 Android 自动化引擎的尝试与未来推演
android·运维·重构·自动化
码云骑士4 小时前
Android SystemServer启动过程
android·systemserver
weiggle5 小时前
第三篇:可组合函数(Composable)——Compose 的基石
android·前端
独隅5 小时前
Android Studio 接入多种不同 AI 大模型进行开发的全面详细指南(Android Studio+AI)
android·人工智能·android studio
夜微凉46 小时前
三、MySQL
android·数据库·mysql
我命由我123456 小时前
Android 开发问题:项目同时引入了两个包含相同类文件的库(AndroidX 库、旧版本支持库),导致了重复类错误
android·java·java-ee·android studio·android-studio·androidx·android runtime
anthonyzhu6 小时前
安卓Android studio panda run无法应用更新的问题
android·ide·android studio
jingling5557 小时前
Flutter | Dio网络请求实战
android·开发语言·前端·flutter