11

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

<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

4 回答 4

7

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

<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 会崩溃并抱怨所引用的可绘制对象是一个未指定可绘制对象的状态列表(它是颜色的状态列表)。

    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(深色)主题,那么您的文本将是浅色,用户将无法影响这一点。您不需要为您的应用程序设置线条颜色动态。

于 2013-08-03T06:35:59.087 回答
3

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

第一个选项

第一个选项是定义一个shape从属性中获取颜色的drawable ?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>

...或者直接设置为你的view的背景,如下...

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使用此方法的属性的确切值并不重要,但必须设置它并且不能设置为@nullor @android:color/transparent

于 2020-10-31T15:45:16.460 回答
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。因此,它不起作用,因为您引用的可绘制对象似乎不符合规范。

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

android:background="@android:color/background_light"
于 2013-08-03T22:54:22.357 回答
0

我认为您想使用本机 android 主要文本颜色。

<item name="android:background">@android:color/primary_text_dark</item>
于 2013-08-02T22:04:55.630 回答