如何实现仅将特定部分着色的SpannableStringBuilder?

时间:2018-09-05 04:50:17

标签: android emoji spannablestringbuilder

我需要实现一个字符串,该字符串可以更改其某些部分的颜色以使其突出显示。我需要创建类似热键指南的内容,以按突出显示的数字来显示您可以执行的操作。我曾经用过HTML。从HTML,但是我已经读到它由于解析而并不快。我需要在速度较慢的设备上运行代码。这是我当前的代码。

private SpannableStringBuilder spannedTxt(String txt, int count){
        String tagStart = "<p>", tagEnd = "</p>";
        String temp = txt;
        int emojCount = count /2;
        emojCount += 1;

        SpannableStringBuilder ssb = new SpannableStringBuilder();

        for (int i = 0; i < count; i++) {
            SpannableString spannable = new SpannableString(temp);
            Log.d(TAG, "convertToSpan: "+spannable.toString());

            spannable.setSpan(new ForegroundColorSpan(Color.RED),
                    txt.indexOf(tagStart) + tagStart.length(), txt.indexOf(tagEnd),
                    Spannable.SPAN_EXCLUSIVE_EXCLUSIVE);

            ssb.append(spannable);

            temp = temp.replaceFirst(tagStart, "");
            temp = temp.replaceFirst(tagEnd, "");
        }

        return ssb;
    }

当前执行的操作是更改<p></p>(是一个数字)中第一个子字符串的样式。出于某种原因,即使我登录时表明已删除标签,也不会从最终SpannableStringBuilder中删除tagStart和tagEnd。

我使用了<p></p>来知道哪一部分需要着色。我需要这样做,因为操作也可以包含数字,并且不需要在操作上为这些数字重新着色。例如,操作1(按1)。该字符串还包含每个动作之间的表情符号,我使用这些表情符号的数量来了解该字符串包含多少个动作。

简单说明:
我需要做的是下面的

动作1(按<p> 1 </p>)动作2(按<p> 2 </p>)进行

Action 1 (Press <font color="red">1</font>)&nbsp;&nbsp; Action 2 (Press <font color="red">2</font>)

使用SpannableStringBuilder之类的东西

2 个答案:

答案 0 :(得分:0)

您可以使用Html.fromHtml()静态函数将HTML代码解析为具有属性(如HTML的属性)的TextView文本,如下所示:

https://stackoverflow.com/a/11062756/5417056

答案 1 :(得分:0)

因此,经过一番思考,我找到了解决问题的方法。我更改了为SpannableStringBuilder创建字符串的方式。

Action 1 (Press <p>[1]<p>)    �� ��    Action 2 (Press <p>[2]<p>)    �� ��    Action 3 (Press <p>[3]<p>)

使用上面的字符串,我已经将代码修改为下面的代码。

private SpannableStringBuilder spannedTxt(String txt){
        String tagStart = "<p>";
        String temp = txt;

        String[] actTxtArr = txt.split(tagStart);

        SpannableStringBuilder ssb = new SpannableStringBuilder();

        for (int i = 0; i < actTxtArr.length; i++) {
            String arrTxt = actTxtArr[i];
            SpannableString spannable;

            if(arrTxt.contains("[")){
                arrTxt = arrTxt.replace("[", "");
                arrTxt = arrTxt.replace("]", "");

                spannable = new SpannableString(arrTxt);

                spannable.setSpan(new ForegroundColorSpan(Color.RED),
                        arrTxt.indexOf(arrTxt), arrTxt.indexOf(arrTxt) + arrTxt.length(),
                        Spannable.SPAN_EXCLUSIVE_EXCLUSIVE);
            }else{
                spannable = new SpannableString(arrTxt);
            }

            ssb.append(spannable);
        }

        return ssb;
    }

现在它按照我想要的方式工作。我希望有人可能需要实施像我确实发现的那样的东西。