Android 具有两种不同颜色的单个文本视图,用于动态文本

Android 具有两种不同颜色的单个文本视图,用于动态文本,android,textview,Android,Textview,我有一个文本视图,我想把以@开头的单词的颜色改成红色,如果还有带#的单词,我想把它改成黑色。文本不是硬编码的。我怎么能做到这一点。请帮助我。我已经尝试了以下代码。但问题是红色只适用于第一个单词 String MsgTitle = Details.get(position).getContent(); String refString; String hashString; if (MsgTitle.c

我有一个文本视图,我想把以@开头的单词的颜色改成红色,如果还有带#的单词,我想把它改成黑色。文本不是硬编码的。我怎么能做到这一点。请帮助我。我已经尝试了以下代码。但问题是红色只适用于第一个单词

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>")));
}
String MsgTitle=Details.get(position.getContent();
字符串引用字符串;
字符串哈希字符串;
if(MsgTitle.contains(“”){
refString=MsgTitle.substring(0,
MsgTitle.indexOf(“”)).trim();
if(String.valueOf(refString.charAt(0))等于(“@”){
refString=refString.replaceFirst((^@\\w+),
"$1");
}否则{
refString=refString.replaceAll((#\\w+),
"$1");
}
hashString=MsgTitle.substring(
MsgTitle.indexOf(“”)+1.trim();
((TextView)vi.findViewById(R.id.textData))
.setText(Html.fromHtml(refString
+ " "
+哈希字符串
.replaceAll((#\\w+),
"$1")));
}
回答我的问题

tring[]str\u array=str.split(“”);
布尔isExists=false;
for(int i=0;i
您可以通过格式化HTML中的字符串来实现这一点:

String text = "<font color=#ff0000>red text</font> <font color=#00ff00>green color</font>";
tv.setText(Html.fromHtml(text));
String text=“红色文本绿色”;
tv.setText(Html.fromHtml(text));
您将需要进行一些编码,以从已获得的@and#标记生成此HTML文本,但这应该不会太难

祝你好运:)

编辑: 这里有一些东西可以修复你的算法。它只适用于查找红色标签,但可以轻松扩展到其他颜色:

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

String text=“lalala@red lalala”;
int indexForRed=text.indexOf(“@”);
int indexForSpace=-1;
字符串红色文本;
文本前的字符串;
文本后的字符串;
while(indexForRed!=-1)
{
indexForSpace=text.indexOf(“,indexForRed);
redText=text.substring(indexForRed+1,indexForSpace);
beforeRedText=indexForRed>0?text.substring(0,indexForRed-1):“”;
afterRedText=indexForSpace

也可以考虑使用另一个分母来代替另一个颜色(而不是γ……可能是$,%,^),这是因为你用来指定字体中的颜色,它可能会混淆整个算法。如果你必须使用#,那么在搜索@之前一定要先搜索#,它应该可以正常工作


希望这有帮助:)

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

String text = "<font color=#ff0000>red text</font> <font color=#00ff00>green color</font>";
tv.setText(Html.fromHtml(text));
String text=“红色文本绿色”;
tv.setText(Html.fromHtml(text));
您将需要进行一些编码,以从已获得的@and#标记生成此HTML文本,但这应该不会太难

祝你好运:)

编辑: 这里有一些东西可以修复你的算法。它只适用于查找红色标签,但可以轻松扩展到其他颜色:

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

String text=“lalala@red lalala”;
int indexForRed=text.indexOf(“@”);
int indexForSpace=-1;
字符串红色文本;
文本前的字符串;
文本后的字符串;
while(indexForRed!=-1)
{
indexForSpace=text.indexOf(“,indexForRed);
redText=text.substring(indexForRed+1,indexForSpace);
beforeRedText=indexForRed>0?text.substring(0,indexForRed-1):“”;
afterRedText=indexForSpace

也可以考虑使用另一个分母来代替另一个颜色(而不是γ……可能是$,%,^),这是因为你用来指定字体中的颜色,它可能会混淆整个算法。如果你必须使用#,那么在搜索@之前一定要先搜索#,它应该可以正常工作

希望这有帮助:)

尝试HTML样式:

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

((TextView) vi.findViewById(R.id.textData))
                        .setText(Html.fromHtml(data));
String data=“蓝黄”;
((TextView)vi.findViewById(R.id.textData))
.setText(Html.fromHtml(数据));
希望这有帮助

尝试HTML样式:

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

((TextView) vi.findViewById(R.id.textData))
                        .setText(Html.fromHtml(data));
String data=“蓝黄”;
((文本视图)vi.findViewById(R.id.textDa
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);
@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));

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