Android:使用TextView.setText()为字符串着色部分?

Jar*_*red 85 android textview

我希望通过.setText("")方法更改TextView视图的文本,同时着色文本的一部分(或使其为粗体,斜体,透明等),而不是其余部分.例如:

title.setText("Your big island <b>ADVENTURE!</b>";
Run Code Online (Sandbox Code Playgroud)

我知道上面的代码是不正确的,但它有助于说明我想要实现的目标.我该怎么做?

Ale*_*lov 196

使用跨度.

例:

final SpannableStringBuilder sb = new SpannableStringBuilder("your text here");

// Span to set text color to some RGB value
final ForegroundColorSpan fcs = new ForegroundColorSpan(Color.rgb(158, 158, 158)); 

// Span to make text bold
final StyleSpan bss = new StyleSpan(android.graphics.Typeface.BOLD); 

// Set the text color for first 4 characters
sb.setSpan(fcs, 0, 4, Spannable.SPAN_INCLUSIVE_INCLUSIVE); 

// make them also bold
sb.setSpan(bss, 0, 4, Spannable.SPAN_INCLUSIVE_INCLUSIVE); 

yourTextView.setText(sb);
Run Code Online (Sandbox Code Playgroud)

  • 我真的不喜欢Android提供的解决方案,因为它不适用于多语言,因为我不知道我的话中有多少个字符.我正在寻找一个解决方案,我可以有多个跨度,我可以附加到TextView,然后将它们放在一起 (8认同)
  • @philipp如果您的问题是您的单词中有多少个字符,请在String或StringBuilder上使用length()方法或其他任何方法 (8认同)

sat*_*sat 46

title.setText(Html.fromHtml("Your big island <b>ADVENTURE!</b>")); 
Run Code Online (Sandbox Code Playgroud)

  • 不,它不是更好,没有着色功能,提到问题但SLOW方法来自HTML() (8认同)
  • 对于原始问题,这是一个比标记答案更好的解决方案. (2认同)

Lui*_*uis 25

我希望这可以帮助你(它适用于多语言).

<string name="test_string" ><![CDATA[<font color="%1$s"><b>Test/b></font>]]> String</string>
Run Code Online (Sandbox Code Playgroud)

在您的Java代码上,您可以:

int color = context.getResources().getColor(android.R.color.holo_blue_light);
String string = context.getString(R.string.test_string, color);
textView.setText(Html.fromHtml(string));
Run Code Online (Sandbox Code Playgroud)

这样,只有"测试"部分将被着色(和粗体).

  • 最佳答案.这适用于国际化字符串.还有一个优点是能够将彩色文本放在字符串资源的中间. (3认同)

liv*_*ove 16

这是一个示例,它将查找所有出现的单词(不区分大小写),并将其着色为红色:

String notes = "aaa AAA xAaax abc aaA xxx";
SpannableStringBuilder sb = new SpannableStringBuilder(notes);
Pattern p = Pattern.compile("aaa", Pattern.CASE_INSENSITIVE);
Matcher m = p.matcher(notes);
while (m.find()){
    //String word = m.group();
    //String word1 = notes.substring(m.start(), m.end());

    sb.setSpan(new ForegroundColorSpan(Color.rgb(255, 0, 0)), m.start(), m.end(), Spannable.SPAN_INCLUSIVE_INCLUSIVE);
}
editText.setText(sb);
Run Code Online (Sandbox Code Playgroud)


Dav*_*son 15

如果您使用的是 Kotlin,则可以使用android-ktx库执行以下操作

val title = SpannableStringBuilder()
        .append("Your big island ")
        .bold { append("ADVENTURE") } 

titleTextField.text = title
Run Code Online (Sandbox Code Playgroud)

bold是一个扩展功能SpannableStringBuilder。您可以在此处查看文档了解您可以使用的操作列表。

另一个例子:

val ssb = SpannableStringBuilder()
            .color(green) { append("Green text ") }
            .append("Normal text ")
            .scale(0.5F) { append("Text at half size ") }
            .backgroundColor(green) { append("Background green") }
Run Code Online (Sandbox Code Playgroud)

哪里green是已解析的 RGB 颜色。

甚至可以嵌套跨度,因此您最终会得到类似嵌入式 DSL 的东西:

bold { underline { italic { append("Bold and underlined") } } }
Run Code Online (Sandbox Code Playgroud)

您的应用程序模块级别需要以下内容build.gradle才能使其工作:

repositories {
    google()
}

dependencies {
    implementation 'androidx.core:core-ktx:0.3'
}
Run Code Online (Sandbox Code Playgroud)


Nan*_*nne 8

您可以使用a Spannable来为文本的某些部分提供某些方面.如果你愿意,我可以查一个例子.

啊,就在stackoverflow上.

TextView TV = (TextView)findViewById(R.id.mytextview01); 
Spannable WordtoSpan = new SpannableString("I know just how to whisper, And I know just how to cry,I know just where to find the answers");        
WordtoSpan.setSpan(new ForegroundColorSpan(Color.BLUE), 15, 30, Spannable.SPAN_EXCLUSIVE_EXCLUSIVE);
TV.setText(WordtoSpan);
Run Code Online (Sandbox Code Playgroud)