java仅在一行字符串中更改文本的颜色
我目前正在开发一个电子邮件应用程序,当您进入查看屏幕时,它会在顶部向您显示消息,如果是一系列电子邮件,则在下面会显示:
-----原始消息------
&;它下面的上一条消息
目前,所有文本均为白色,但我希望显示除以下内容之外的所有文本:
----原始信息------
由于这是一个电子邮件应用程序,不同的提供商对原始消息字符串的格式不同(请参见下面的示例:)
- ----原始消息--
- ----原始消息--
- ------原始信息------
- ------原始信息------
我如何让包含“原始消息”(以及破折号(无论有多少破折号))的整行变为蓝色
如果这是一个普通的文本视图,并且我知道字符串中的文本,那么我可以使用:
String startText = "Test - received<br><br>";
String textColor = "<font color='#0475F7'>-------- Original Message --------</font><br><br>";
String endText = "From: Test 124<br>" + "To: Test 125<br>" + "Subject: " + "<" + "confirm" + ">" + "<br>" + "Sent: January 30, 2017 3:40:42 PM GMT+00:00<br><br>" + "Test";
String text = startText + textColor + endText;
messageTextView.setText(Html.fromHtml(text), TextView.BufferType.SPANNABLE);
但由于这是一个电子邮件应用程序,我无法确定每次字符串中出现的文本,因为每封电子邮件都会有所不同。整个消息(因此消息顶部的“原始消息”行和下面的消息都包含在一个字符串中)
我尝试了以下方法:
if (message.contains("Original Message")) {
int counter = message.split("-", -1).length - 1;
int sideone = counter / 2;
int sidetwo = counter / 2;
Log.d(TAG, "COUNTER: " + counter);
int startPosition = message.indexOf("-");
int endPosition = message.lastIndexOf("-");
Log.d(TAG, "START POS: " + startPosition + " " + "END POS: " + endPosition);
String requiredString = message.substring(startPosition, endPosition);
Log.d(TAG, "REQUIRED STRING: " + requiredString);
messageTextView.setText(message);
} else {
messageTextView.setText(message);
}
虽然柜台会告诉我有多少破折号,我不知道如何使用它来得到整个线与破折号和“原始消息”的一部分在中间。同样,使用requiredString方法也会起作用(但在结尾处切掉一个破折号),如果用户在电子邮件中的某个地方使用了破折号,那么它就不会起作用,因为它会尝试在“原始邮件”行之前获取破折号
因此,我正在寻找一种方法来完成以下工作:
- 检索字符串中包含单词“Original Message”及其附带的所有破折号的整行
- 将颜色设置为蓝色(#0475F7)
- 将文本视图设置为消息文本在顶部(白色)+“原始消息”行(蓝色)后接消息底部(白色)
# 1 楼答案
最好的方法是使用HTML/XML标记。Android的类能够解析HTML/XML,并添加所需的必要样式。看这个link
如果不想使用HTML,还可以查看Span类
希望这有帮助
# 2 楼答案
通过使用Spanable(如上所述),然后检查配置,解决了这个问题