0

我需要实现一个字符串来更改它的某些部分的颜色以突出显示它。我需要创建一个类似于热键指南的东西,它显示您可以通过按下突出显示的数字来执行的操作。我曾经使用 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>是一个数字。出于某种原因, tagStart 和 tagEnd 没有从最终的 SpannableStringBuilder 中删除,即使当我登录时它显示标签已被删除。

我使用<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 类似的东西

4

2 回答 2

0

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

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

于 2018-09-05T08:23:50.320 回答
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;
    }

现在它按我想要的方式工作。我希望可能需要实现类似我所做的事情的人发现这很有用。

于 2018-09-05T08:34:48.277 回答