如何实现只有特定部分有颜色的 SpannableStringBuilder?
How to implement a SpannableStringBuilder where only a certain part is colored?
我需要实现一个字符串来改变它某些部分的颜色以突出显示它。我需要创建类似热键指南的内容,显示您可以通过按突出显示的数字执行的操作。我以前用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>
来知道哪个部分是once需要上色的。我需要它,因为动作也可以包含数字,我不需要在动作上重新着色这些数字。例如,操作 1(按 1)。该字符串还包含每个动作之间的表情符号,我使用这些表情符号的计数来了解该字符串包含多少个动作。
更简单的解释:
我需要做的如下
操作1(按<p>
1</p>
)操作2(按<p>
2</p>
)到
Action 1 (Press <font color="red">1</font>) Action 2 (Press <font color="red">2</font>)
类似使用 SpannableStringBuilder 的东西
您可以使用Html.fromHtml() 静态函数将HTML 代码解析为具有属性(如HTML 的属性)的TextView 文本,如下所示:
所以,经过一番思考,我找到了解决问题的办法。我更改了一些为 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;
}
现在它按照我想要的方式工作。我希望可能需要实现类似我所做的东西的人会发现这很有用。
我需要实现一个字符串来改变它某些部分的颜色以突出显示它。我需要创建类似热键指南的内容,显示您可以通过按突出显示的数字执行的操作。我以前用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>
来知道哪个部分是once需要上色的。我需要它,因为动作也可以包含数字,我不需要在动作上重新着色这些数字。例如,操作 1(按 1)。该字符串还包含每个动作之间的表情符号,我使用这些表情符号的计数来了解该字符串包含多少个动作。
更简单的解释:
我需要做的如下
操作1(按<p>
1</p>
)操作2(按<p>
2</p>
)到
Action 1 (Press <font color="red">1</font>) Action 2 (Press <font color="red">2</font>)
类似使用 SpannableStringBuilder 的东西
您可以使用Html.fromHtml() 静态函数将HTML 代码解析为具有属性(如HTML 的属性)的TextView 文本,如下所示:
所以,经过一番思考,我找到了解决问题的办法。我更改了一些为 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;
}
现在它按照我想要的方式工作。我希望可能需要实现类似我所做的东西的人会发现这很有用。