【问题标题】:How to color part of TextView in android? [duplicate]如何在android中为TextView的一部分着色? [复制]
【发布时间】:2011-11-12 22:34:15
【问题描述】:

我正在尝试更改 TextView 中某些单词(搜索结果)的颜色?我尝试使用这样的 ANSI 颜色:

text.setText("\u001B31;1m" + "someText");

但它不起作用。我如何做到这一点?

【问题讨论】:

标签: java android android-layout


【解决方案1】:

这对你有帮助

Spannable WordtoSpan = new SpannableString("I know just how to whisper");        
WordtoSpan.setSpan(new ForegroundColorSpan(Color.BLUE), 5, 13, 
Spannable.SPAN_EXCLUSIVE_EXCLUSIVE);
textview.setText(WordtoSpan);

【讨论】:

  • 5 , 13 是字符的长度。
  • 你的意思是开始和结束索引?
  • 是的。即您要为文本着色的部分。彩色文本视图的起点和终点。
【解决方案2】:

您正在寻找 TextAppearanceSpan 和 'SpannableString' 为了更清晰的工作流程如下

  1. 从源字符串创建 SpannableString
  2. 创建 TextAppearanceSpan 并通过调用 SpannableString 上的 setSpan 方法进行设置
  3. 以 SpannableString 作为参数调用 textView.setText 方法

【讨论】:

    【解决方案3】:

    你也可以像下面的例子那样使用 HTML:

    string = "<font color='#FFFFFF'>This is my text </font>" + "<font color='#000000'> Another text </font>";
    textView.setText(Html.fromHtml(string));
    

    不使用附加变量(单行解决方案):

    textView.setText(Html.fromHtml("<font color='#FFFFFF'>This is my text </font>" + "<font color='#000000'> Another text </font>"));
    

    这是非常简单易懂的解决方案:)

    【讨论】:

    • Html.fromHtml(string) 现在已弃用。请更新您的答案。
    【解决方案4】:

    我知道我参加聚会有点晚了,但我认为这将有助于未来的访客。

    您可能想在布局 XML 上设置部分文本颜色,而不是使用 Java 代码,因此根据此线程上的先前答案,我创建了一个小类来解决问题。

    1 - 首先让我们创建我们的组件

    package yourpackagehere.component;
    
    import android.content.Context;
    import android.content.res.TypedArray;
    import android.graphics.Color;
    import android.text.Spannable;
    import android.text.SpannableString;
    import android.text.style.ForegroundColorSpan;
    import android.util.AttributeSet;
    
    import yourpackagehere.R;
    
    public class FontSpannableTextView extends TextView {
    
        public FontSpannableTextView(Context context) {
            super(context);
        }
    
        public FontSpannableTextView(Context context, AttributeSet attrs) {
            super(context, attrs);
            setColorPartialString(context, attrs);
        }
    
        public FontSpannableTextView(Context context, AttributeSet attrs, int defStyle) {
            super(context, attrs, defStyle);
            setColorPartialString(context, attrs);
        }
    
        private void setColorPartialString(Context context, AttributeSet attrs) {
            if (isInEditMode()) {
                return;
            }
            String partialText = null;
            int partialTextColor = Integer.MIN_VALUE;
    
            if (attrs != null) {
                TypedArray a = context.obtainStyledAttributes(attrs, R.styleable.FontSpannableTextView);
                for (int i = 0; i < a.getIndexCount(); i++) {
                    int attr = a.getIndex(i);
                    switch (attr) {
                        case R.styleable.FontSpannableTextView_fontspannabletextview_partialText:
                            partialText = a.getString(attr);
                            break;
                        case R.styleable.FontSpannableTextView_fontspannabletextview_partialTextColor:
                            partialTextColor = a.getColor(attr, Color.BLACK);
                            break;
                    }
                }
                a.recycle();
            }
    
            if (partialText != null && partialTextColor != Integer.MIN_VALUE) {
                String wholeText = getText().toString();
                Spannable spannable = new SpannableString(wholeText);
                spannable.setSpan(new ForegroundColorSpan(partialTextColor),
                        wholeText.indexOf(partialText),
                        wholeText.indexOf(partialText) + partialText.length(),
                        Spannable.SPAN_EXCLUSIVE_EXCLUSIVE);
                setText(spannable);
            } else {
                Log.e("YOURTAGHERE","You must provide both partialText and partialTextColor values");
            }
        }
    }
    

    2 - attrs.xml

    <?xml version="1.0" encoding="utf-8"?>
    <resources>
        <declare-styleable name="FontSpannableTextView">
            <attr name="fontspannabletextview_partialText" format="string" />
            <attr name="fontspannabletextview_partialTextColor" format="color" />
        </declare-styleable>
    </resources>
    

    3 - 让我们在测试布局中使用它

    <?xml version="1.0" encoding="utf-8"?>
    <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
        android:orientation="vertical"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        xmlns:app="http://schemas.android.com/apk/res-auto">
    
    
        <yourpackagehere.component.FontSpannableTextView
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:text="@string/hello_world" <!-- Hello world! -->
            android:layout_margin="25dp"
            app:fontspannabletextview_partialText="@string/world" <!-- world! -->
            app:fontspannabletextview_partialTextColor="@color/tutorial_yellow"
            android:textSize="40sp"
            />
    
    </LinearLayout>
    

    例子:

    【讨论】:

    • 这是一个优雅的解决方案。十年以来我一直在研究 android,但即使在 2020 年,这似乎也是 android 中 TextView 的一个主要问题。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-06-24
    • 1970-01-01
    • 2015-12-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多