如何使用textColorPrimary作为样式中的背景颜色?

时间:2013-07-24 19:53:38

标签: android styles

我想创建一个使用android textColorPrimary作为背景颜色的样式。 我尝试了以下不起作用,结果是我的布局根本没有显示。

<style name="horizontalLine">
    <item name="android:layout_width">fill_parent</item>
    <item name="android:layout_height">1dp</item>
    <item name="android:background">?android:attr/textColorPrimary</item>
</style>

如何在样式中使用textColorPrimary作为背景颜色?

4 个答案:

答案 0 :(得分:6)

在尝试使用属性时,此语法似乎对我有用:

<TextView
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:textColor="?android:textColorPrimary"
        android:text="Hello"/>

(或)

<style name="MyStyle">
   <item name="android:textColor">?android:textColorPrimary</item>
</style>

我可以将应用主题从Holo更改为Holo.Light,文字颜色会自动更改以适应。

当我将其设置为View的背景时它不起作用 - Android会崩溃抱怨引用的drawable是一个没有指定drawables的状态列表(它是state list of colors)。

    Caused by: org.xmlpull.v1.XmlPullParserException: Binary XML file line #2: <item> tag requires a 'drawable' attribute or child tag defining a drawable
    at android.graphics.drawable.StateListDrawable.inflate(StateListDrawable.java:178)
    at android.graphics.drawable.Drawable.createFromXmlInner(Drawable.java:885)
    at android.graphics.drawable.Drawable.createFromXml(Drawable.java:822)
    at android.content.res.Resources.loadDrawable(Resources.java:1950)
    ... 39 more

我正在使用HoloEverywhere,它允许我直接引用资源,但您应该在本机案例中遇到类似的问题。我不认为在状态列表xml中用作组件的主要,未选择,未激活(等)颜色是通过属性公开的。

在任何情况下,使用的文本颜色取决于您(应用程序开发人员)选择的主题。如果您选择使用Holo(深色)主题,那么您的文字将是浅色,用户将无法对此产生影响。您无需为应用创建线条颜色动态。

答案 1 :(得分:2)

我得到的错误信息是:

org.xmlpull.v1.XmlPullParserException: Binary XML file line #18: <item> tag requires a 'drawable' attribute or child tag defining a drawable

进行一些挖掘,规范说background属性应该支持颜色或对可绘制资源的引用:

...查看您引用的资源, StateListDrawable

platforms/android-17/data/res/color/primary_text_dark.xml

<selector xmlns:android="http://schemas.android.com/apk/res/android">
    <item android:state_enabled="false" android:color="@android:color/bright_foreground_dark_disabled"/>
    <item android:state_window_focused="false" android:color="@android:color/bright_foreground_dark"/>
    <item android:state_pressed="true" android:color="@android:color/bright_foreground_dark_inverse"/>
    <item android:state_selected="true" android:color="@android:color/bright_foreground_dark_inverse"/>
    <item android:state_activated="true" android:color="@android:color/bright_foreground_dark_inverse"/>
    <item android:color="@android:color/bright_foreground_dark"/> <!-- not selected -->
</selector>

但是,StateListDrawable的文档也明确说明必须为drawable元素定义item属性:

https://developer.android.com/guide/topics/resources/drawable-resource.html

<item>
    Defines a drawable to use during certain states, as described by its attributes. Must be a child of a <selector> element.

    attributes:

    android:drawable
        Drawable resource. Required. Reference to a drawable resource.

...... primary_text_dark.xml的情况并非如此。所以,它不起作用,因为你引用的drawable似乎不符合规范。

我认为解决方法是引用primary_text_dark中用于默认状态的颜色:bright_foreground_dark。看到这不是公开的,你需要直接转到它引用的那个,即:

android:background="@android:color/background_light"

答案 2 :(得分:1)

要将?android:attr/textColorPrimary属性用作视图的背景,您有两个选择。

第一个选项

第一种选择是定义一个shape可绘制对象,其颜色来自?android:attr/textColorPrimary属性,如下所示...

<shape xmlns:android="http://schemas.android.com/apk/res/android" android:shape="rectangle">
    <solid android:color="?android:attr/textColorPrimary" />
</shape>

...,并假设您已将此绘制对象命名为rectangle_shape_with_primary_text_color.xml并将其放置在应用程序的res/drawable文件夹中,则可以按如下所示将其设置为样式的背景...

<item name="android:background">@drawable/rectangle_shape_with_primary_text_color</item>

...或将其直接设置为视图的背景,如下所示...

android:background="@drawable/rectangle_shape_with_primary_text_color"

第二个选项

第二个选项是设置样式或视图的backgroundTint属性。

您可以如下设置样式的backgroundTint属性:

<style name="horizontalLine">
    <item name="android:background">@android:color/white</item>
    <item name="android:backgroundTint">?android:attr/textColorPrimary</item>
</style>

或者您可以直接如下设置视图的backgroundTint属性:

<View
    android:id="@+id/horizontalLine"
    android:layout_width="match_parent"
    android:layout_height="1dp"
    android:background="@android:color/white"
    android:backgroundTint="?android:attr/textColorPrimary" />

请注意,使用此方法的background属性的确切值并不重要,但必须将其设置,并且不能将其设置为@null@android:color/transparent

答案 3 :(得分:0)

我认为你想使用原生的android主文本颜色。

<item name="android:background">@android:color/primary_text_dark</item>