我想创建一个使用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作为背景颜色?
答案 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>