仅在一行字符串中更改文本颜色 Android
Change colour of text in only one line of String Android
我目前正在开发一个电子邮件应用程序,当您进入查看屏幕时,它会在顶部显示消息,如果它是一系列电子邮件,则在其下方将显示:
------ 原始消息 ------
& 它下面的上一条消息。
目前,所有这些文本都是白色的,但我想以白色显示所有文本,除了:
------ 原始消息 ------
因为这是一个电子邮件应用程序,不同的提供商对原始消息字符串的格式不同(参见下面的示例:)
- ----原始消息----
- ---- 原始消息----
- ------原始消息------
- ------ 原始消息 ------
我怎样才能让包含 'Original Message'(和破折号(不管有多少破折号))的整行变成蓝色?
如果这是一个普通的 textView,并且我知道字符串中的文本,那么我可以使用:
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);
但由于这是一个电子邮件应用程序,我无法确定每次都会出现在字符串中的文本,因为每封电子邮件都会有所不同。整个消息(所以消息的顶部,'Original Message' 行和下面的消息都包含在一个字符串中)。
我尝试了以下方法:
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);
}
虽然计数器会告诉我有多少个破折号,但我无法弄清楚如何使用它来获得带有破折号和中间 'Original Message' 部分的整行。同样使用 requiredString 方法也可以工作(但从末尾切掉一个破折号),如果用户在他们的电子邮件中的某处使用了一个破折号,那么它就不会工作,因为它会尝试在 [=55 之前获取破折号=] 行。
因此,我正在寻找一种方法来执行以下操作:
- 检索字符串中包含单词 'Original Message' 及其所有破折号的整行
- 将颜色设置为蓝色 (#0475F7)
- 将 textView 设置为顶部的消息文本(白色)+ 'Original Message' 行(蓝色)后跟底部的消息(白色)
解决这个问题的最佳方法是使用 HTML/XML 标签。 Android 有 类 能够解析 HTML/XML 并添加所需的必要样式。看到这个 link.
如果不想走HTML路线,也可以看看Span 类.
希望对您有所帮助。
设法通过使用 Spannable(如上建议)解决此问题,然后检查配置。
if (message != null) {
if (message.contains("-------- Original Message --------")) {
Log.d(TAG, "Encromail configuration");
String wordToFind = "-------- Original Message --------";
Pattern word = Pattern.compile(wordToFind);
Matcher match = word.matcher(message);
Spannable wordToSpan = new SpannableString(message);
while (match.find()) {
Log.d(TAG, "Found Original Message string at index " + match.start() + " - " + (match.end() - 1));
wordToSpan.setSpan(new ForegroundColorSpan(getResources().getColor(R.color.electric_blue)), match.start(), match.end(), Spannable.SPAN_EXCLUSIVE_EXCLUSIVE);
}
messageTextView.setText(wordToSpan);
} else if (message.contains("------ Original Message ------")) {
Log.d(TAG, "App to app configuration");
String wordToFind = "------ Original Message ------";
Pattern word = Pattern.compile(wordToFind);
Matcher match = word.matcher(message);
Spannable wordToSpan = new SpannableString(message);
while (match.find()) {
Log.d(TAG, "Found Original Message string at index " + match.start() + " - " + (match.end() - 1));
wordToSpan.setSpan(new ForegroundColorSpan(getResources().getColor(R.color.electric_blue)), match.start(), match.end(), Spannable.SPAN_EXCLUSIVE_EXCLUSIVE);
}
messageTextView.setText(wordToSpan);
} else if (message.contains("------Original Message------")) {
Log.d(TAG, "BlackBerry 7 configuration");
String wordToFind = "------Original Message------";
Pattern word = Pattern.compile(wordToFind);
Matcher match = word.matcher(message);
Spannable wordToSpan = new SpannableString(message);
while (match.find()) {
Log.d(TAG, "Found Original Message string at index " + match.start() + " - " + (match.end() - 1));
wordToSpan.setSpan(new ForegroundColorSpan(getResources().getColor(R.color.electric_blue)), match.start(), match.end(), Spannable.SPAN_EXCLUSIVE_EXCLUSIVE);
}
messageTextView.setText(wordToSpan);
} else {
Log.d(TAG, "Message doesn't contain Original Message string");
messageTextView.setText(message);
}
}
我目前正在开发一个电子邮件应用程序,当您进入查看屏幕时,它会在顶部显示消息,如果它是一系列电子邮件,则在其下方将显示:
------ 原始消息 ------
& 它下面的上一条消息。
目前,所有这些文本都是白色的,但我想以白色显示所有文本,除了:
------ 原始消息 ------
因为这是一个电子邮件应用程序,不同的提供商对原始消息字符串的格式不同(参见下面的示例:)
- ----原始消息----
- ---- 原始消息----
- ------原始消息------
- ------ 原始消息 ------
我怎样才能让包含 'Original Message'(和破折号(不管有多少破折号))的整行变成蓝色?
如果这是一个普通的 textView,并且我知道字符串中的文本,那么我可以使用:
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);
但由于这是一个电子邮件应用程序,我无法确定每次都会出现在字符串中的文本,因为每封电子邮件都会有所不同。整个消息(所以消息的顶部,'Original Message' 行和下面的消息都包含在一个字符串中)。
我尝试了以下方法:
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);
}
虽然计数器会告诉我有多少个破折号,但我无法弄清楚如何使用它来获得带有破折号和中间 'Original Message' 部分的整行。同样使用 requiredString 方法也可以工作(但从末尾切掉一个破折号),如果用户在他们的电子邮件中的某处使用了一个破折号,那么它就不会工作,因为它会尝试在 [=55 之前获取破折号=] 行。
因此,我正在寻找一种方法来执行以下操作:
- 检索字符串中包含单词 'Original Message' 及其所有破折号的整行
- 将颜色设置为蓝色 (#0475F7)
- 将 textView 设置为顶部的消息文本(白色)+ 'Original Message' 行(蓝色)后跟底部的消息(白色)
解决这个问题的最佳方法是使用 HTML/XML 标签。 Android 有 类 能够解析 HTML/XML 并添加所需的必要样式。看到这个 link.
如果不想走HTML路线,也可以看看Span 类.
希望对您有所帮助。
设法通过使用 Spannable(如上建议)解决此问题,然后检查配置。
if (message != null) {
if (message.contains("-------- Original Message --------")) {
Log.d(TAG, "Encromail configuration");
String wordToFind = "-------- Original Message --------";
Pattern word = Pattern.compile(wordToFind);
Matcher match = word.matcher(message);
Spannable wordToSpan = new SpannableString(message);
while (match.find()) {
Log.d(TAG, "Found Original Message string at index " + match.start() + " - " + (match.end() - 1));
wordToSpan.setSpan(new ForegroundColorSpan(getResources().getColor(R.color.electric_blue)), match.start(), match.end(), Spannable.SPAN_EXCLUSIVE_EXCLUSIVE);
}
messageTextView.setText(wordToSpan);
} else if (message.contains("------ Original Message ------")) {
Log.d(TAG, "App to app configuration");
String wordToFind = "------ Original Message ------";
Pattern word = Pattern.compile(wordToFind);
Matcher match = word.matcher(message);
Spannable wordToSpan = new SpannableString(message);
while (match.find()) {
Log.d(TAG, "Found Original Message string at index " + match.start() + " - " + (match.end() - 1));
wordToSpan.setSpan(new ForegroundColorSpan(getResources().getColor(R.color.electric_blue)), match.start(), match.end(), Spannable.SPAN_EXCLUSIVE_EXCLUSIVE);
}
messageTextView.setText(wordToSpan);
} else if (message.contains("------Original Message------")) {
Log.d(TAG, "BlackBerry 7 configuration");
String wordToFind = "------Original Message------";
Pattern word = Pattern.compile(wordToFind);
Matcher match = word.matcher(message);
Spannable wordToSpan = new SpannableString(message);
while (match.find()) {
Log.d(TAG, "Found Original Message string at index " + match.start() + " - " + (match.end() - 1));
wordToSpan.setSpan(new ForegroundColorSpan(getResources().getColor(R.color.electric_blue)), match.start(), match.end(), Spannable.SPAN_EXCLUSIVE_EXCLUSIVE);
}
messageTextView.setText(wordToSpan);
} else {
Log.d(TAG, "Message doesn't contain Original Message string");
messageTextView.setText(message);
}
}