0

我有一个文本视图,我想将以 @ 开头的单词的颜色更改为红色,如果还有带有 # 的单词,我想将其更改为黑色。文本不是硬编码的。我该怎么做。请帮帮我。我试过下面的代码。但问题是红色只适用于第一个单词。

String MsgTitle = Details.get(position).getContent();
                String refString;
                String hashString;
                if (MsgTitle.contains(" ")) {
                    refString = MsgTitle.substring(0,
                            MsgTitle.indexOf(' ')).trim();

                    if (String.valueOf(refString.charAt(0)).equals("@")) {
                        refString = refString.replaceFirst("(^@\\w+)",
                                "<font color='#8A0A0A'>$1</font>");
                    } else {
                        refString = refString.replaceAll("(#\\w+)",
                                "<font color='#000000'><b>$1</b></font>");
                    }

                    hashString = MsgTitle.substring(
                            MsgTitle.indexOf(' ') + 1).trim();
                    ((TextView) vi.findViewById(R.id.textData))
                            .setText(Html.fromHtml(refString
                                    + " "
                                    + hashString
                                            .replaceAll("(#\\w+)",
                                                    "<font color='#000000'><b>$1</b></font>")));
}

回答我的问题

tring[] str_array = str .split(" ");

            boolean isExists = false;
            for (int i = 0; i < str_array.length; i++) {
                for (int j = 0; j < i; j++) {
                    if (str_array[j].equals(str_array[i])) {
                        isExists = true;
                    }
                }
                if (str_array[i].startsWith("@") && !isExists) {
                    str  = str .replace(str_array[i],
                            "<font color='#8A0A0A'>" + str_array[i]
                                    + "</font>");
                } else if (str_array[i].contains("#")) {
                    str  = str .replaceAll(str_array[i],
                            "<font color='#000000'><b>" + str_array[i]
                                    + "</b></font>");
                }
            }
4

6 回答 6

3

这样做。。

@Override
        protected void onCreate(Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);
            setContentView(R.layout.activity_main);
            txtHeader = (TextView) findViewById(R.id.txtHeader);
            String str = "hello as new kkk @lll llll kkkk mm nn dd #jjj @pppp";

            String[] str_array = str.split(" ");

            for (int i = 0; i < str_array.length; i++) {
                if (str_array[i].startsWith("@")) {
                    str=str.replaceAll(str_array[i], "<font color='red'>" + str_array[i] + "</font>");
                } else if (str_array[i].startsWith("#")) {
                    str=str.replaceAll(str_array[i], "<font color='black'>" + str_array[i] + "</font>");
                }
            }

            txtHeader.setText(Html.fromHtml(str));

        }
于 2013-09-25T11:08:27.517 回答
1

尝试 HTML 样式:

String data = "<font color=##00FFFF>blue</font> <font color=#FFFF00>yellow</font>";

((TextView) vi.findViewById(R.id.textData))
                        .setText(Html.fromHtml(data));

希望这可以帮助

于 2013-09-25T10:47:06.577 回答
0

您可以通过格式化 HTML 中的字符串来做到这一点:

String text = "<font color=#ff0000>red text</font> <font color=#00ff00>green color</font>";
tv.setText(Html.fromHtml(text));

您需要进行一些编码以从您拥有的 @ 和 # 标记生成此 HTML 文本,但这应该不会太难。

祝你好运 :)

编辑:这是应该修复您的算法的东西。它仅适用于查找红色标签,但可以轻松扩展为其他颜色:

(顺便说一句,我没有测试它,所以这里和那里可能会有一些小故障......希望你能够解决它们:P)

String text = "lalala @red lalala";
        int indexForRed = text.indexOf("@");
        int indexForSpace = -1;
        String redText;
        String beforeRedText;
        String afterRedText;


        while (indexForRed != -1)
        {
            indexForSpace = text.indexOf(" ", indexForRed);
            redText = text.substring(indexForRed + 1, indexForSpace);           
            beforeRedText = indexForRed > 0 ? text.substring(0, indexForRed - 1) : "";
            afterRedText = indexForSpace < text.length() - 1 ? text.substring(indexForSpace + 1, text.length()) : "";

            text = beforeRedText + "<font color=\"#ff0000\">" + redText + "</font>" + afterRedText;         

            indexForRed = text.indexOf("@", text.indexOf("</font>", indexForSpace));
        }
tv.setText(Html.fromHtml(text));

此外,您可能会考虑为另一种颜色使用不同的分母(而不是 #... 可能是 $、%、^),因为 # 用于指定字体中的颜色,它可能会混淆整个算法。如果你必须使用#,那么一定要在搜索@之前搜索#,它应该可以正常工作。

希望这可以帮助 :)

于 2013-09-25T10:42:48.447 回答
0

下面是一个动态设置文本颜色的例子:

SpannableString text = new SpannableString("Lorem ipsum dolor sit amet");  
// make "Lorem" (characters 0 to 5) red  
text.setSpan(new ForegroundColorSpan(Color.RED), 0, 5, 0);  
textView.setText(text, BufferType.SPANNABLE);

使用 indexOf(char c) 获取 '@' 和 '#' 的索引。

于 2013-09-25T10:54:10.837 回答
0

Html.fromHtml 对于这样的事情是一个讨厌的解决方法,你可以使用它,通过形成peoper html标签并调用 fromHtml 但在引擎盖下该方法解析你的html并创建跨度并使用 Spannable 接口,这就是你真正尝试的

于 2013-09-25T10:56:04.290 回答
0
String res1[] = {"#11111","#22222","#3333","#4444","#555","#666","#77","#88","#99","#100","#161","#152"};

String aa=(String) (res1[position]+","+res[position]+"---"+des[position]);


if (res1[position].startsWith("#")) {
   aa=aa.replaceAll(res1[position], "<b>" + res1[position] + "</b>");
}

holder.problem.setText(Html.fromHtml(aa));

代替粗体,我们可以使用 ant 标签 ex:......ect,。

于 2014-05-20T11:38:05.797 回答