Java 如何在Android中格式化TextView文本?

Java 如何在Android中格式化TextView文本?,java,android,textview,Java,Android,Textview,我正在创建一个Twitter应用程序,我一直在努力寻找一种有效的方式来格式化tweet 示例推文:“RT@BlahBlah这是一条推文#你好” 我想格式化这个字符串的某些部分。例如,超链接是蓝色的,标签是灰色的,@xxx是绿色的 我该怎么做呢?事实上,您可以使用HTML标记格式化TextView中的文本。我看了一看这篇文章,我想它应该能回答你的问题:Spannable可以完成这项工作: 这是可行的,但我认为它效率不高,因为它必须遍历整个字符串。我需要为很多推特做这个。。。 有没有更好更有效的方法

我正在创建一个Twitter应用程序,我一直在努力寻找一种有效的方式来格式化tweet

示例推文:“RT@BlahBlah这是一条推文#你好”

我想格式化这个字符串的某些部分。例如,超链接是蓝色的,标签是灰色的,@xxx是绿色的


我该怎么做呢?

事实上,您可以使用HTML标记格式化TextView中的文本。我看了一看这篇文章,我想它应该能回答你的问题:

Spannable可以完成这项工作:


这是可行的,但我认为它效率不高,因为它必须遍历整个字符串。我需要为很多推特做这个。。。 有没有更好更有效的方法

    int atStart = 0;
    int atEnd = 0;
    boolean atFound = false;

    String regex = "\\W";

    System.out.println(str.length());

    for(int i = 0;i < str.length();i++)
    {
        String a = Character.toString(str.charAt(i));

        if(a.matches(regex)| i==str.length()-1 && atFound)
        {
            System.out.println(i + "REGEX MATCH");

            if(i== str.length()-1)
            {
                atEnd = i+1;
            }else
            atEnd = i;

            i--; // <- decrement. otherwise "@hello@hello" won't change

            atFound = false;

            str.setSpan(new BackgroundColorSpan(0xFFFF0000), atStart,
                    atEnd, Spannable.SPAN_EXCLUSIVE_EXCLUSIVE);
        }else

        if(a.equals("@"))
        {
            atStart = i;
            atFound = true;
        }
    }
intatstart=0;
int atEnd=0;
布尔值=false;
字符串regex=“\\W”;
System.out.println(str.length());
对于(int i=0;i我--;//我一直在那个线程中,这很有帮助。但问题是我不知道开始格式化的索引,因为每个tweet都会不同。我需要一种方法来检查“@”的时间开始,存储该索引并存储下一个空间的索引。http也是如此,而且#在Java中,有几种方法可以获取子字符串的位置:这是一个非常糟糕的想法。使用Html类比使用Spanable慢得多(这就是Html类本身获取文本的目的)正如manutudescends的答案所建议的那样,请直接查看Html类的源代码以了解: