只更改一行String Android

时间:2017-02-01 14:44:37

标签: java android string textview textcolor

我目前正在开发一个电子邮件应用程序,当您进入视图屏幕时,它会在顶部显示消息,如果是一系列电子邮件,则会在其下方显示:

------原始信息------

&安培;它下面的上一条消息。

目前,所有这些文字都是白色的,但我想以白色显示所有文字:

------原始信息------

由于这是一个电子邮件应用程序,不同的提供程序以不同方式格式化原始消息字符串(请参阅下面的示例:)

  • ----原帖------
  • ----原帖------
  • ------原帖------
  • ------原帖------

我如何获得包含'原始消息'的整行? (和破折号(但有很多破折号))是蓝色的?

如果这是一个普通的textView,并且我知道将在String中的文本,那么我可以使用:

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

但由于这是一个电子邮件应用程序,我无法确定每次都会出现在字符串中的文本,因为每封电子邮件都会有所不同。整个消息(消息的顶部,&#39;原始消息&#39; line&amp;下面的消息都包含在一个字符串中)。

我尝试了以下内容:

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

虽然计数器会告诉我有多少破折号,但我无法弄清楚如何使用破折号和原始消息&#39;部分在中间。同样使用requiredString方法可以工作(但是从最后删除一个短划线)如果用户在他们的电子邮件中的某处使用了短划线,那么它将无法工作,因为它会尝试在&之前获得破折号#39;原始消息&#39;线。

因此,我正在寻找一种方法来执行以下操作:

  • 检索包含单词&#39;原始消息&#39;的字符串中的整行。以及随之而来的所有破折号
  • 将颜色设置为蓝色(#0475F7)
  • 将textView设置为顶部的消息文本(白色)+&#39;原始消息&#39;行(蓝色),然后是底部的消息(白色)

2 个答案:

答案 0 :(得分:1)

解决此问题的最佳方法是使用HTML / XML标记。 Android具有能够解析HTML / XML并添加所需样式的类。请参阅此link

如果您不想使用HTML路线,还可以查看Span课程。

希望这有帮助。

答案 1 :(得分:0)

通过使用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);
            }
        }