Android:具有多种颜色和字体的TextView

时间:2015-05-07 13:20:51

标签: android textview spannablestring

好的,所以我认为这应该是一个相当简单的过程。

我读过以下问题:

在所有这些问题和答案中,建议似乎非常相似。我正在尝试避免使用HTML技术,而是使用SpannableStringSpannableStringBuilder。最后,我希望能够在单个TextView中使用多种不同的字体,但就目前而言,我只想弄清楚如何使多种颜色有效。

我正试图以这种方式实现这些技术:

// Get a typeface for my custom font
String regularFontPath          = "fonts/Abel-Regular.ttf";
Typeface regularTf              = Typeface.createFromAsset(getActivity().getAssets(), regularFontPath);

// Set the label's typeface (this part is working)
mItemCodesLabel.setTypeface(regularTf);

// Create a spannable builder to build up my
// TextView's content from data
SpannableStringBuilder builder  = new SpannableStringBuilder();

// These colors are defined and working well in other parts of my app
ForegroundColorSpan ltGraySpan  = new ForegroundColorSpan(R.color.light_gray);
ForegroundColorSpan dkGraySpan  = new ForegroundColorSpan(R.color.dark_gray);

// mCodesList has good data and the actual data output from this
// loop is correct. Just the styling is wrong
for (int i = 0; i < mCodesList.size(); i = i + 1) {
    ParseObject code            = mCodesList.get(i);
    String value                = code.getString("value") + " | ";
    if (i > 0) {
        // I want new codes to be on a new line (this works)
        value                   = "\n" + value;
    }
    SpannableString valueSpan   = new SpannableString(value);
    valueSpan.setSpan(ltGraySpan, 0, value.length(), Spanned.SPAN_EXCLUSIVE_EXCLUSIVE);
    builder.append(valueSpan);

    String loc                  = code.getString("location");
    SpannableString locSpan     = new SpannableString(loc);
    locSpan.setSpan(dkGraySpan, 0, loc.length(), Spanned.SPAN_EXCLUSIVE_EXCLUSIVE);
    builder.append(locSpan);
}
mItemCodesLabel.setText(builder);

最终结果是TextView包含正确的文本内容。 TextView是正确的字体。但TextView的全部内容都是@color/light_gray颜色。我不确定原因,因为在XML布局文件中,我已经指定了我的@color/dark_gray颜色(我希望通过设置Spannable来覆盖该颜色) 。即使我更改了两个ForegroundColorSpan对象以使用R.color.dark_grayTextView仍然会显示为浅灰色。在我的代码中我没有看到其他地方我正在设置文本的颜色,所以我真的很茫然。

我在LG Optimus G Pro上运行,运行4.4.2。我有另一个TextView我需要获得多种颜色和字体工作,甚至强调文本的某些部分,所以这对我来说是一个非常重要的事情。我哪里错了?

2 个答案:

答案 0 :(得分:3)

使用getResource().getColor(R.color.light_gray)检索您传递给ForegroundColorSpan的颜色。我怀疑它是否在内部为您检索。您可能需要在每次迭代时实例化一个新的ForegroundColorSpan。无法重复使用

答案 1 :(得分:1)

您可以使用SpannableStringBuilder,因为它是从spannable和CharSequence实现的,您也可以使用以下内容执行任何操作

TextView txtTest = (TextView) findViewById(R.id.txt);
String text = "This is an example";    
final SpannableStringBuilder str = new SpannableStringBuilder(text);
str.setSpan(new TypefaceSpan("monospace"), 0, 8, Spannable.SPAN_EXCLUSIVE_EXCLUSIVE);
str.setSpan(new TypefaceSpan("serif"), 9, 12, Spannable.SPAN_EXCLUSIVE_EXCLUSIVE);
str.setSpan(new ForegroundColorSpan(getResources().getColor(R.color.white)), 0, 5, Spannable.SPAN_EXCLUSIVE_EXCLUSIVE);
str.setSpan(new ForegroundColorSpan(getResources().getColor(R.color.grey)), 6, 8, Spannable.SPAN_EXCLUSIVE_EXCLUSIVE);
str.setSpan(new android.text.style.StyleSpan(android.graphics.Typeface.BOLD), 0, 3, Spannable.SPAN_EXCLUSIVE_EXCLUSIVE);
txtTest.setText(str);

我在values

中添加了colors.xml
<color name="black">#000000</color>
<color name="grey">#DCDCDC</color>
<color name="white">#FFFFFF</color>