Android 更改文本视图中一个单词的文本颜色

Android 更改文本视图中一个单词的文本颜色,android,string,colors,textview,Android,String,Colors,Textview,我正在寻找从活动中更改文本视图中单个单词的文本颜色的方法 例如: String first = "This word is "; String next = "red" TextView t = (TextView) findViewById(R.id.textbox); t.setText(first + next); 如何将下一个文本的颜色更改为红色?我知道的最简单的方法就是使用html String first = "This word is "; String next = "<

我正在寻找从
活动
中更改
文本视图
中单个单词的文本颜色的方法

例如:

String first = "This word is ";
String next = "red"
TextView t = (TextView) findViewById(R.id.textbox);
t.setText(first + next);

如何将
下一个
文本的颜色更改为红色?

我知道的最简单的方法就是使用html

String first = "This word is ";
String next = "<font color='#EE0000'>red</font>";
t.setText(Html.fromHtml(first + next));
String first=“这个词是”;
String next=“红色”;
t、 setText(Html.fromHtml(first+next));
但这将要求您在(如果?)更改颜色时重建TextView,这可能会引起麻烦

t.setText(first + next, BufferType.SPANNABLE);
Spannable s = (Spannable)t.getText();
int start = first.length();
int end = start + next.length();
s.setSpan(new ForegroundColorSpan(0xFFFF0000), start, end, Spannable.SPAN_EXCLUSIVE_EXCLUSIVE);

您必须使用Spanable这也将允许您增加一些文本的大小,使其粗体等。。。。甚至可以放入一些图像。

如果您想更改
文本视图
文本中特定
字符串
的所有实例的状态(不区分大小写),您可以使用
StringBuilder
s和
SpannableString
如下:

StringBuilder textBuilder = new StringBuilder(myTextView.getText().toString());
StringBuilder searchedTextBuilder = new StringBuilder((mySearchedString));
SpannableString spannableString = new SpannableString(myTextView.getText().toString());

int counter = 0;
int index = 0;

for (int i = 0;i < textBuilder.length() - mySearchedString.length() - 1;i++)
{
    counter = 0;
    if (Character.toLowerCase(textBuilder.charAt(i)) == Character.toLowerCase(searchedTextBuilder.charAt(index)))
    {
        counter++;
        index++;
        for (int j = 1,z = i + 1;j < mySearchedString.length() - 1;j++,z++)
        {
            if (Character.toLowerCase(textBuilder .charAt(z)) == Character.toLowerCase(searchedTextBuilder .charAt(index)))
            {
                counter++;
                index++;
            }
            else
            {
                index++;
                if (index % mySearchedString.length() == 0)
                {
                    index = 0;
                }
                break;
             }
        }
        if (counter == mySearchedString.length() - 1) // A match
        {
            spannableString.setSpan(new ForegroundColorSpan(Color.RED), i,
                                i + mySearchedString.length(), Spannable.SPAN_EXCLUSIVE_EXCLUSIVE); // Do the change you want(In this case changing the fore ground color to red)
            index = 0;
            continue;
        }
        else
        {
            index = 0;
            continue;
        }
    }
}
myTextView.setText(spannableString);
StringBuilder textBuilder=newstringbuilder(myTextView.getText().toString());
StringBuilder searchedTextBuilder=新StringBuilder((mySearchedString));
SpannableString SpannableString=新的SpannableString(myTextView.getText().toString());
int计数器=0;
int指数=0;
对于(int i=0;i
}

  • 将整个
    TextView
    文本存储在
    StringBuilder
  • 将搜索的字符串存储在
    StringBuilder
  • 将整个
    TextView
    文本存储在
    SpannableString
  • 执行一个简单的操作,查找
    文本视图
    文本中的所有
    字符串
    实例,并在到达时更改它们
  • TextView
    的文本值设置为
    SpannableString

像这样使用SpannableStringBuilder:

SpannableStringBuilder builder = new SpannableStringBuilder();

SpannableString str1= new SpannableString("Text1");
str1.setSpan(new ForegroundColorSpan(Color.RED), 0, str1.length(), 0);
builder.append(str1);

SpannableString str2= new SpannableString(appMode.toString());
str2.setSpan(new ForegroundColorSpan(Color.GREEN), 0, str2.length(), 0);
builder.append(str2);

TextView tv = (TextView) view.findViewById(android.R.id.text1);
tv.setText( builder, TextView.BufferType.SPANNABLE);

对于长字符串,可以使用以下选项:

String help = getString(R.string.help);
help = help.replace("some word", "<font color='#EE0000'>some word</font>");
txtDesc.setText(Html.fromHtml(help));
String help=getString(R.String.help);
帮助=帮助。替换(“某个词”、“某个词”);
txtDesc.setText(Html.fromHtml(帮助));

我在Kotlin中为自己的用例实现了一个实用函数,可能对其他人有用

fun getCusomTextWithSpecificTextWithDiffColor(textToBold: String, fullText: String,
                                                  targetColor: Int) =
            SpannableStringBuilder(fullText).apply {
                setSpan(ForegroundColorSpan(targetColor),
                        fullText.indexOf(textToBold),
                        (fullText.indexOf(textToBold) + textToBold.length),
                        Spannable.SPAN_EXCLUSIVE_EXCLUSIVE)
            }
我如何使用它:

context?.let {
        infoMessage.text = AppUtils.getCusomTextWithSpecificTextWithDiffColor(
                wordAsBold,
                completeSentence, ContextCompat.getColor(it, R.color.white))
    }
使用:

makeTextBold("Your order is accepted","accepted", textView);
makeTextBold("Your order is canceled","canceled", textView);
功能:

public static void makeTextBold(String sentence, String word, AppCompatTextView textView) {
    SpannableStringBuilder builder = new SpannableStringBuilder();
    int startIndex = sentence.indexOf(word.toLowerCase().trim());
    int endIndex = startIndex + word.toLowerCase().trim().length();
    SpannableString spannableString = new SpannableString(sentence);
    StyleSpan boldSpan = new StyleSpan(Typeface.BOLD);
    spannableString.setSpan(boldSpan, startIndex, endIndex, Spannable.SPAN_EXCLUSIVE_EXCLUSIVE); //To make text Bold
    spannableString.setSpan(new ForegroundColorSpan(Color.RED), startIndex, endIndex, Spannable.SPAN_EXCLUSIVE_EXCLUSIVE); //To change color of text
    builder.append(spannableString);
    textView.setText(builder, TextView.BufferType.SPANNABLE);
}

我认为这更具可读性 用于在字符串中为单词着色 它也可能更有效一点,因为你只写一次

    String str  = YOUR_STRING
    Spannable s = new SpannableString(str);
    int start = str.indexOf(err_word_origin);
    int end =  start + err_word_origin.length();
    s.setSpan(new ForegroundColorSpan(Color.BLUE), start, end, Spannable.SPAN_EXCLUSIVE_EXCLUSIVE);
    YOUR_TEXT_VIEW.setText(s , TextView.BufferType.SPANNABLE);

这绝对是最简单的方法,但颜色不应该是color='#EE0000'英镑符号需要表示十六进制的颜色。修复了,谢谢!我不记得我是从实际代码中复制的还是从内存中用颜色生成器网站复制的,所以它以前可能不起作用。好吧,请确保!此外,正如我发现的,你不能使用8位十六进制代码,所以没有阿尔法成分。那件事让我有点难堪。使用
fromHtml
现在已经不推荐了
Html。fromHtml
已经不推荐了。这对我有用!可能重复的好答案,谢谢。在这种情况下,可以使用“s.length()”代替“start+next.length()”:int end=s.length();以防任何人寻找Xamarin.Android解决方案。您可以使用控件的
TextFormatted
属性来分配
SpannableString
对象。无法使其正常工作。最终采用了BK的解决方案。如果有一个构建,那么最好使用它。2.什么对你不起作用?这个解决方案很旧,非常旧,一些API已经更改、添加、删除、错误修复,到底是什么失败了?我得到
java.lang.String无法转换为android.text.Spannable
错误。有什么可以替换
new ForegroundColorSpan(Color)
以使文本保留其原始默认颜色?如何添加纯文本(字符串)在文本视图的中间?