Как реализовать SpannableStringBuilder, где только определенная часть окрашена? - PullRequest
0 голосов
/ 05 сентября 2018

Мне нужно реализовать строку, которая меняет цвет некоторых ее частей, чтобы выделить ее. Мне нужно создать что-то вроде руководства по горячим клавишам, которое отображает действие, которое вы можете выполнить, нажав выделенный номер. Я использовал 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

Ответы [ 2 ]

0 голосов
/ 05 сентября 2018

Итак, подумав, я нашел решение для своей проблемы. Я немного изменил способ создания строки для 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;
    }

Теперь это работает так, как я хотел. Я надеюсь, что кому-то, кому может понадобиться реализовать что-то вроде того, что я действительно нашел, было полезно

0 голосов
/ 05 сентября 2018

вы можете использовать статическую функцию Html.fromHtml () для разбора HTML-кода в текст TextView со свойствами (как у HTML), как показано ниже:

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...