如何在drawable中引用颜色属性?

Mic*_*hal 38 android android-layout

我想做一件简单的事情:定义一个drawable,它与系统状态按下的背景颜色具有非常相似的背景颜色.我在res/drawables/my_drawable.xml中这样做:

<?xml version="1.0" encoding="utf-8"?>
  <selector xmlns:android="http://schemas.android.com/apk/res/android" >
    <item android:state_selected="true">
      <color android:color="?android:attr/colorPressedHighlight"/>
    </item>
    <item android:state_selected="false">
      <color android:color="@color/section_list_background"/>
    </item>    
  </selector>
Run Code Online (Sandbox Code Playgroud)

我总是得到:

java.lang.UnsupportedOperationException: Cant convert to color: type=0x2
Run Code Online (Sandbox Code Playgroud)

有线索吗?

问候

pet*_*syn 53

您可能需要执行以下操作来解决问题:

1)为颜色文件中的每个主题定义2种颜色:

<?xml version="1.0" encoding="utf-8"?>
<resources>
    <color name="my_color_dark">#ff33B5E5</color>
    <color name="my_color_light">#ff355689</color>
</resources>
Run Code Online (Sandbox Code Playgroud)

2)使用内容创建文件res/values/attrs.xml:

<?xml version="1.0" encoding="utf-8"?>
<resources>
    <attr name="my_color" format="reference" />
</resources>
Run Code Online (Sandbox Code Playgroud)

3)假设在styles.xml(Theme.darkTheme.light)中有2个主题定义:

<style name="Theme.dark" parent="@style/Theme.Sherlock">
    <item name="my_color">@color/my_color_dark</item>
</style>

<style name="Theme.light" parent="@style/Theme.Sherlock.Light">
    <item name="my_color">@color/my_color_light</item>
</style>
Run Code Online (Sandbox Code Playgroud)

4)使用drawable中的颜色:

<color android:color="?attr/my_color"/>
Run Code Online (Sandbox Code Playgroud)

希望这可以解决你的问题.

  • 更正@BladeCoder评论,此解决方案适用于API 21+.参考:https://code.google.com/p/android/issues/detail?id = 26251. (13认同)
  • 出于某种原因,我得到了这种方法的错误:`android.view.InflateException:二进制XML文件行#2:错误膨胀类<unknown> (11认同)
  • 如果我尝试这种方法,我会得到同样的错误.它适用于android:布局xml中的颜色但不是可绘制的xml.繁琐的解决方法:final TypedValue typedValue = new TypedValue(); getTheme().resolveAttribute(R.attr.tx_frq,typedValue,true); COLOR = typedValue.data; Drawable d = getResources().getDrawable(R.drawable.mydrawable); d.setColorFilter(COLOR,PorterDuff.Mode.MULTIPLY); (2认同)
  • 此解决方案仅适用于API 11+.对于API 10及更低版本,您无法在Drawable xml文件中引用属性. (2认同)

Sac*_*ani 8

只需在其中创建一个新的color.xml文件,/res/values/color.xml并在其中放入如下代码:

<?xml version="1.0" encoding="utf-8"?>
<resources>
    <color name="editcolor">#ff99ffff</color>
    <color name="transparent">#00000000</color>
</resources>
Run Code Online (Sandbox Code Playgroud)

  • 不,因为如果我想更改主题,或者有人会在电话上选择不同的主题,我仍然会保持固定值。 (3认同)

XGo*_*het 6

您正在尝试将属性转换为颜色。属性是通常附加到视图的属性,然后可以使用主题设置样式。

您需要在 xml 中引用颜色资源。您可以通过创建自己的资源来实现:

<?xml version="1.0" encoding="utf-8"?>
<resources>
    <color name="colorPressedHighlight">#FF8800</color>
</resources>
Run Code Online (Sandbox Code Playgroud)

然后像这样引用它:

<?xml version="1.0" encoding="utf-8"?>
<selector xmlns:android="http://schemas.android.com/apk/res/android" >
    <item android:state_selected="true">
        <color android:color="@color/colorPressedHighlight"/>
    </item>
    <item android:state_selected="false">
        <color android:color="@color/section_list_background"/>
    </item>    
</selector>
Run Code Online (Sandbox Code Playgroud)

或者您可以参考 Android 资源中可用的颜色:

<?xml version="1.0" encoding="utf-8"?>
<selector xmlns:android="http://schemas.android.com/apk/res/android" >
    <item android:state_selected="true">
        <color android:color="@android:color/holo_orange_light"/>
    </item>
    <item android:state_selected="false">
        <color android:color="@android:color/holo_blue_dark"/>
    </item>
</selector>
Run Code Online (Sandbox Code Playgroud)


Ale*_*nov 5

你不能?attr在xml drawable资源中使用,因为aapt在编译时创建了可绘制的资源.Attr资源用于运行时的动态连接


归档时间:

查看次数:

56257 次

最近记录:

7 年 前