有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

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: " + "&lt;" + "confirm" + "&gt;" + "<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)
  • 将文本视图设置为消息文本在顶部(白色)+“原始消息”行(蓝色)后接消息底部(白色)

共 (2) 个答案

  1. # 1 楼答案

    最好的方法是使用HTML/XML标记。Android的类能够解析HTML/XML,并添加所需的必要样式。看这个link

    如果不想使用HTML,还可以查看Span

    希望这有帮助

  2. # 2 楼答案

    通过使用Spanable(如上所述),然后检查配置,解决了这个问题

    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);
                }
            }