изменить цвет строки программно в зависимости от условия - PullRequest
0 голосов
/ 25 июня 2018

Можно ли установить несколько цветов для разных фрагментов текста в TextView с условием if?

Вот мой код:

mColoredText = findViewById(R.id.questionText);
        String mColoredString = "BLACK RED GREEN YELLOW ORANGE BLUE WHITE";
        SpannableStringBuilder builder = new SpannableStringBuilder();

        if(mColoredString.contains("RED")) {
            String red = "RED";
            SpannableString redSpannable = new SpannableString(red);
            redSpannable.setSpan(new ForegroundColorSpan(Color.RED), 0, red.length(), 0);
            builder.append(redSpannable);
        }

        if(mColoredString.contains("YELLOW")) {
            String yellow = "YELLOW";
            SpannableString whiteSpannable = new SpannableString(yellow);
            whiteSpannable.setSpan(new ForegroundColorSpan(Color.YELLOW), 0, yellow.length(), 0);
            builder.append(whiteSpannable);
        }

        if(mColoredString.contains("BLUE")) {
            String blue = "BLUE";
            SpannableString blueSpannable = new SpannableString(blue);
            blueSpannable.setSpan(new ForegroundColorSpan(Color.BLUE), 0, blue.length(), 0);
            builder.append(blueSpannable);
        }

        mColoredText.setText(builder, TextView.BufferType.SPANNABLE);

Но конечный результат всегда печатается: КРАСНЫЙ ЖЕЛТЫЙ СИНИЙ с его цветом, всего три текста.

Полагаю, что ЧЕРНЫЙ КРАСНЫЙ ЗЕЛЕНЫЙ ЖЕЛТЫЙ ОРАНЖЕВЫЙ СИНИЙ БЕЛЫЙ написан все вместе, и белый цвет применим, если нет настраиваемого цвета.

Ответы [ 2 ]

0 голосов
/ 25 июня 2018

Попробуйте этот код ..

    textView = findViewById(R.id.tvData);
    String mColoredString = "BLACK RED GREEN YELLOW ORANGE BLUE WHITE";
    SpannableStringBuilder builder = new SpannableStringBuilder();

    String strArray[] = mColoredString.split(" ");
    for (int i = 0; i < strArray.length; i++) {
        if (strArray[i].equals("RED")) {
            SpannableString redSpannable = new SpannableString(strArray[i]);
            redSpannable.setSpan(new ForegroundColorSpan(Color.RED), 0, strArray[i].length(), 0);
            builder.append(redSpannable);
        } else if (strArray[i].equals("YELLOW")) {
            SpannableString whiteSpannable = new SpannableString(strArray[i]);
            whiteSpannable.setSpan(new ForegroundColorSpan(Color.YELLOW), 0, strArray[i].length(), 0);
            builder.append(whiteSpannable);
        } else if (strArray[i].equals("BLUE")) {
            SpannableString blueSpannable = new SpannableString(strArray[i]);
            blueSpannable.setSpan(new ForegroundColorSpan(Color.BLUE), 0, strArray[i].length(), 0);
            builder.append(blueSpannable);
        } else {
            builder.append(strArray[i]);
        }

    }
    textView.setText(builder);

}
0 голосов
/ 25 июня 2018

Вы создаете нового строителя и добавляете в него только КРАСНЫЙ ЖЕЛТЫЙ и СИНИЙ цвета. Вот почему вы всегда видите КРАСНЫЙ ЖЕЛТЫЙ СИНИЙ.

Если вы хотите обновить исходный текст, сначала вам нужно сделать SpannableString из него.

SpannableString mColoredString = new SpannableString("BLACK RED GREEN YELLOW ORANGE BLUE WHITE");

if (mColoredString.toString().contains("RED")) {
    mColoredString.setSpan(new ForegroundColorSpan(Color.RED), 6, 9, Spannable.SPAN_EXCLUSIVE_EXCLUSIVE);
}
if (mColoredString.toString().contains("YELLOW")) {
    mColoredString.setSpan(new ForegroundColorSpan(Color.YELLOW), 16, 22, Spannable.SPAN_EXCLUSIVE_EXCLUSIVE);
}
if (mColoredString.toString().contains("BLUE")) {
    mColoredString.setSpan(new ForegroundColorSpan(Color.BLUE), 30, 34, Spannable.SPAN_EXCLUSIVE_EXCLUSIVE);
}

questionText.setText(mColoredString);

Пожалуйста, прочитайте эту статью для подробного объяснения.

EDIT

Если вы не знаете позиции start и end, то вам необходимо рассчитать их:

if (mColoredString.toString().contains("YELLOW")) {
    int start = mColoredString.toString().indexOf("YELLOW");
    int end = start + "YELLOW".length();
    mColoredString.setSpan(new ForegroundColorSpan(Color.YELLOW), start, end, Spannable.SPAN_EXCLUSIVE_EXCLUSIVE);
}
...