android - 根据条件以编程方式更改字符串颜色
问题描述
是否可以使用 if 条件为 TextView 内的不同文本设置多种颜色?
这是我的代码:
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);
但最终的结果总是打印:RED YELLOW BLUE 和它的颜色,只有三个文本。
我希望 BLACK RED GREEN YELLOW ORANGE BLUE WHITE 写在一起,如果没有可扩展的颜色,则适用白色。
解决方案
您创建一个新的构建器并只添加红色黄色和蓝色。这就是为什么你总是看到红黄蓝。
如果要更新原始文本,则必须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);
}
推荐阅读
- abap - SELECT 的内联数据后出错:“不包含结构...”
- c# - 在 asp.net core 3 中设置 httpcontext
- javascript - 当按下 ENTER 或按下它的按钮时,使表单运行 javascript,而不提交
- c# - 绑定 WPF C# 后,MVVM 中 DataGridListView 的 SelectedItem 为空
- flutter - 如何自定义 CupertinoTabBar
- image - 是否可以将图像用于 ipywidget 按钮
- android - 如何收听android MediaPlayer位置变化事件
- javascript - 如何查看我未创建的网站的 .js 文件
- arrays - 使用巨大的 Numpy 数组而不将其全部存储在内存中
- c++ - 为什么 fwrite / fread 不像 56.806201550387598?