5

我曾经能够做到这一点:

<string name="foo">white <font fgcolor="#ff6890a5">blue</font></string>

但现在它不再起作用了。这似乎是整数解析代码中的一个错误;见https://code.google.com/p/android/issues/detail?id=58192

问题是,我现在收到客户投诉;我等不及要修复这个错误了。

有谁知道解决方法,例如使用 color.xml 中的命名资源或类似的东西?

ETA:我发现fgcolor="blue"仍然有效,但它是错误的蓝色阴影。某处是否有合法颜色名称的列表?也许我能找到一个足够接近的。如果颜色是没有设置高位的数字,它也可以工作,比如#7f6890a5,但当然这太微弱了,没有用;我需要纯色,而不是半透明的。

ETA:浏览源代码显示这些颜色:

  aqua      0x00FFFF
  black     0x000000
  blue      0x0000FF
  fuchsia   0xFF00FF
  green     0x008000
  grey      0x808080
  lime      0x00FF00
  maroon    0x800000
  navy      0x000080
  olive     0x808000
  purple    0x800080
  red       0xFF0000
  silver    0xC0C0C0
  teal      0x008080
  white     0xFFFFFF
  yellow    0xFFFF00

这并不能解决我的问题,但也许其他搜索此问题的人会发现此信息很有用。

4

3 回答 3

11

我们如何利用没有高位设置的颜色仍然有效的事实,并用正确的颜色替换它?所以你可以有这样的方法:

private CharSequence fixSpanColor(CharSequence text) {
    if (text instanceof Spanned) {
        final SpannableString s = new SpannableString(text);
        final ForegroundColorSpan[] spans = s.getSpans(0, s.length(), ForegroundColorSpan.class);
        for (final ForegroundColorSpan oldSpan : spans) {
            final ForegroundColorSpan newSpan = new ForegroundColorSpan(oldSpan.getForegroundColor() | 0xFF000000);
            s.setSpan(newSpan, s.getSpanStart(oldSpan), s.getSpanEnd(oldSpan), s.getSpanFlags(oldSpan));
            s.removeSpan(oldSpan);
        }
        return s;
    } else {
        return text;
    }
}

然后,您将需要通过此方法传递具有所需颜色重音的任何文本,最简单的示例是修改所有调用,如下所示:

tv.setText(getText(R.string.foo));

至:

tv.setText(fixSpanColor(getText(R.string.foo)));

希望根据代码的结构,可能已经有一个中心位置可以添加这个额外的方法调用。

于 2013-09-16T23:56:49.930 回答
4

我的客户端代码中有一些糟糕的解决方法来手动将 ForegroundColorSpans 重置为正确的颜色,但不必这样做会很棒。

我认为问题记者谈论的解决方法如下:

将字符串定义为:

<string name="foo">white blue</string>

在您的活动中:

TextView tv = (TextView) findViewById(R.id.textView1);

SpannableString spannableString = new 
                       SpannableString(getResources().getString(R.string.foo));

ForegroundColorSpan fcs = new 
                       ForegroundColorSpan(getResources().getColor(R.color.bluish));

spannableString.setSpan(fcs, spannableString.toString().indexOf(" ") + 1,
                       spannableString.length(), Spannable.SPAN_INCLUSIVE_INCLUSIVE);

tv.setText(spannableString);

R.color.bluish定义为<color name="bluish">#ff6890a5</color>

但是,使用“”(空格)来区分和应用ForegroundColorSpan只有在定义了少量字符串时才实用。


以下修改实际上可能更容易执行:

将字符串定义为:

<string name="foo_sep_1"><![CDATA[white <font color=\"#6890a5\">blue</font>]]></string>

或者:

<string name="foo_sep_1">white &lt;font color="#6890a5"&gt;blue&lt;/font&gt;</string>

在您的活动中:

TextView tv2 = (TextView) findViewById(R.id.textView2);

tv2.setText(Html.fromHtml(getResources().getString(R.string.foo_sep_1)));

注意颜色代码:HTML 颜色代码没有alpha值(RRGGBB会起作用,AARRGGBB不会)


另一种解决方法是Html.fromHtml(String)直接使用:

TextView tv3 = (TextView) findViewById(R.id.textView3);

tv3.setText(Html.fromHtml("white <font color='#6890a5'>blue</font>"));
于 2013-09-13T20:45:21.367 回答
0

感谢 TWiStErRob,他在https://stackoverflow.com/a/11577658/338479中找到了不涉及代码的解决方案。去引用:

对于 7fffffff 以上的任何颜色,应用以下内容: <font color="#ff6890a5"> 将 ff6890a5 放入计算器(可选择先转换为十进制)并翻转符号,然后(可选择转换回十六进制)取最后 8 个十六进制数字并使用 <font color="-#00976F5B">。

于 2015-07-27T14:52:38.647 回答