Изменить цвет строки программно в зависимости от условия
Можно ли установить несколько цветов для разных частей текста внутри 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 ответа
Решение
Попробуйте этот код..
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);
}
Вы создаете нового строителя и добавляете в него только КРАСНЫЙ ЖЕЛТЫЙ и СИНИЙ цвета. Вот почему вы всегда видите КРАСНЫЙ ЖЕЛТЫЙ СИНИЙ.
Если вы хотите обновить исходный текст, то вы должны сделать 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);
Пожалуйста, прочитайте эту статью для подробного объяснения.
РЕДАКТИРОВАТЬ:
Если вы не знаете 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);
}