android:textColor 不再适用于 Marshmallow
android:textColor no longer works in Marshmallow
我编写了一个依赖资源中定义的颜色的应用程序。有些是直接在布局 XML 文件中设置的,有些是在代码中设置的。示例:
res/values/styles.xml
中的颜色定义:
<color name="orvGyro">#33B5E5</color>
布局:
<TextView
android:id="@+id/textView3"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="@string/dotSpace"
android:textAppearance="?android:attr/textAppearanceSmall"
android:textColor="@color/orvGyro" />
代码中的颜色:
accStatus.setTextColor(getResources().getColor(R.color.somecolor));
该应用程序的目标是 API 17。在 Lollipop 之前,它运行完美,显示正确的颜色。迁移到 Marshmallow (Cyanogenmod 13) 后,所有这些颜色都显示为橙色。 Java 代码而非资源中定义的其他颜色似乎可以正确显示。
我尝试将目标 API 更改为 23 并为 API 21+ 添加样式,但无济于事。
这是怎么回事?这是 CyanogenMod13 中的错误,还是我做错了什么?
编辑: 看来这与从资源中获取颜色无关。如下所示硬编码颜色也给我橙色文本:
<TextView
android:id="@+id/textView9"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="@string/dotSpace"
android:textAppearance="?android:attr/textAppearanceSmall"
android:textColor="#669900" />
编辑 2: 刚遇到 。这可以解释我遇到的行为吗?
编辑 3: 当我动态生成内容而不是使用布局时,颜色显示正确。示例:
TextView newType = new TextView(rilLteCells.getContext());
newType.setLayoutParams(new TableRow.LayoutParams(0, LayoutParams.WRAP_CONTENT, 2));
newType.setTextAppearance(rilLteCells.getContext(), android.R.style.TextAppearance_Medium);
newType.setTextColor(rilLteCells.getContext().getResources().getColor(getColorFromGeneration(cell.getGeneration())));
newType.setText(rilLteCells.getContext().getResources().getString(R.string.smallDot));
row.addView(newType);
使用 ContextCompat class,它是助手 class 以向后兼容的方式访问 API 级别 4 之后引入的上下文中的功能。
accStatus.setTextColor(ContextCompat.getColor(context, R.color.somecolor));
public static final int getColor (Context context, int id)
Returns a color associated with a particular resource ID
知道了。
无论我在哪里遇到这个问题,控件中显示的文本都是一个正方形 (U+2b1b)。当我更改此文本(例如通过附加 X)时,只有正方形将显示为橙色,而字符串的其余部分具有所需的颜色。
改成小方块(U+25fc)固定东西。其他一些特殊字符会给我其他颜色——显然某些字符在 Marshmallow 上固定为某些颜色,而在早期版本中,它们可以像任何其他文本一样设置样式。
在我的 Sony Xperia (Android 6.0 Marshmallow) 上遇到同样的问题。原因是启用了 Settings/Accessibility/High 对比文本(实验性)。
当我禁用它时,它又按预期正常工作了。
我编写了一个依赖资源中定义的颜色的应用程序。有些是直接在布局 XML 文件中设置的,有些是在代码中设置的。示例:
res/values/styles.xml
中的颜色定义:
<color name="orvGyro">#33B5E5</color>
布局:
<TextView
android:id="@+id/textView3"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="@string/dotSpace"
android:textAppearance="?android:attr/textAppearanceSmall"
android:textColor="@color/orvGyro" />
代码中的颜色:
accStatus.setTextColor(getResources().getColor(R.color.somecolor));
该应用程序的目标是 API 17。在 Lollipop 之前,它运行完美,显示正确的颜色。迁移到 Marshmallow (Cyanogenmod 13) 后,所有这些颜色都显示为橙色。 Java 代码而非资源中定义的其他颜色似乎可以正确显示。
我尝试将目标 API 更改为 23 并为 API 21+ 添加样式,但无济于事。
这是怎么回事?这是 CyanogenMod13 中的错误,还是我做错了什么?
编辑: 看来这与从资源中获取颜色无关。如下所示硬编码颜色也给我橙色文本:
<TextView
android:id="@+id/textView9"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="@string/dotSpace"
android:textAppearance="?android:attr/textAppearanceSmall"
android:textColor="#669900" />
编辑 2: 刚遇到
编辑 3: 当我动态生成内容而不是使用布局时,颜色显示正确。示例:
TextView newType = new TextView(rilLteCells.getContext());
newType.setLayoutParams(new TableRow.LayoutParams(0, LayoutParams.WRAP_CONTENT, 2));
newType.setTextAppearance(rilLteCells.getContext(), android.R.style.TextAppearance_Medium);
newType.setTextColor(rilLteCells.getContext().getResources().getColor(getColorFromGeneration(cell.getGeneration())));
newType.setText(rilLteCells.getContext().getResources().getString(R.string.smallDot));
row.addView(newType);
使用 ContextCompat class,它是助手 class 以向后兼容的方式访问 API 级别 4 之后引入的上下文中的功能。
accStatus.setTextColor(ContextCompat.getColor(context, R.color.somecolor));
public static final int getColor (Context context, int id)
Returns a color associated with a particular resource ID
知道了。
无论我在哪里遇到这个问题,控件中显示的文本都是一个正方形 (U+2b1b)。当我更改此文本(例如通过附加 X)时,只有正方形将显示为橙色,而字符串的其余部分具有所需的颜色。
改成小方块(U+25fc)固定东西。其他一些特殊字符会给我其他颜色——显然某些字符在 Marshmallow 上固定为某些颜色,而在早期版本中,它们可以像任何其他文本一样设置样式。
在我的 Sony Xperia (Android 6.0 Marshmallow) 上遇到同样的问题。原因是启用了 Settings/Accessibility/High 对比文本(实验性)。
当我禁用它时,它又按预期正常工作了。