【问题标题】:How to reference colour attribute in drawable? [duplicate]如何在drawable中引用颜色属性? [复制]
【发布时间】:2018-08-15 00:35:42
【问题描述】:

我想做一件简单的事: 定义一个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>

我总是得到:

java.lang.UnsupportedOperationException: Cant convert to color: type=0x2

有什么线索吗?

问候

【问题讨论】:

    标签: android android-layout


    【解决方案1】:

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

    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>
    

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

    <?xml version="1.0" encoding="utf-8"?>
    <resources>
        <attr name="my_color" format="reference" />
    </resources>
    

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

    <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>
    

    4) 在可绘制对象中使用颜色:

    <color android:color="?attr/my_color"/>
    

    希望这能解决您的问题。

    【讨论】:

    • 由于某种原因,这种方法出现错误:android.view.InflateException: Binary XML file line #2: Error inflating class &lt;unknown&gt;
    • 如果我尝试这种方法,我会遇到同样的错误。它适用于布局 xml 中的 android:color,但不适用于可绘制 xml。一个乏味的解决方法: final TypedValue typedValue = new TypedValue(); getTheme().resolveAttribute(R.attr.tx_frq, typedValue, true);颜色 = typedValue.data;可绘制 d = getResources().getDrawable(R.drawable.mydrawable); d.setColorFilter(COLOR, PorterDuff.Mode.MULTIPLY);
    • 此解决方案仅适用于 API 11+。对于 API 10 及更低版本,您不能引用 Drawable xml 文件中的属性。
    • 更正@BladeCoder 评论,此解决方案适用于 API 21+。参考:code.google.com/p/android/issues/detail?id=26251.
    【解决方案2】:

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

    <?xml version="1.0" encoding="utf-8"?>
    <resources>
        <color name="editcolor">#ff99ffff</color>
        <color name="transparent">#00000000</color>
    </resources>
    

    【讨论】:

    • 不,因为如果我想改变主题,或者有人会在手机上选择不同的主题,我仍然会保持固定值。
    【解决方案3】:

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

    【讨论】:

      【解决方案4】:

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

      您需要在 xml 中引用颜色资源。您可以通过创建自己的资源来做到这一点:

      <?xml version="1.0" encoding="utf-8"?>
      <resources>
          <color name="colorPressedHighlight">#FF8800</color>
      </resources>
      

      然后像这样引用它:

      <?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>
      

      或者您可以参考 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>
      

      【讨论】:

      • 好的,我明白了。也许我使用了错误的想法。让我告诉你我想要达到的目标。我有一些自定义视图,我想将其设置为与实际主题按下状态颜色完全相同的选定状态背景颜色。认为我不会使用@android:color/... 来实现这一点。
      • 您使用的是官方安卓主题吗?然后您可以链接到颜色,或者只是从 $ANDROID_SDK$/platforms/android-14/data/res 中的 sdk 获取可绘制对象。
      • 是的,我同意,但是当我想允许在我的应用程序中更改主题时,我将不得不自己处理自定义可绘制对象的颜色更改。我想我可以以某种方式自动执行此操作 - 将其背景颜色与 attr 值保持一致。
      • 您所说的主题是自定义主题吗?如果是这样,您可以让您的主题更改自定义视图上的自定义属性
      • 我有这样的例子。假设我允许用户更改主题(可以选择 Holo 和 Holo.Light 之一)。当他改变主题文本的颜色时,背景也会改变。我想要实现的是我想在我的自定义视图背景上粘贴一些属性,所以当用户更改主题时颜色会改变。
      【解决方案5】:

      尝试这种方式将颜色放入 android:drawable 中,如下所示

      <?xml version="1.0" encoding="utf-8"?>
      <selector xmlns:android="http://schemas.android.com/apk/res/android">
          <item android:state_pressed="true" android:drawable="?android:attr/colorPressedHighlight"/> <!-- pressed -->
          <item android:state_focused="true" android:drawable="@color/blue"/> <!-- focused -->
          <item android:drawable="@color/section_list_background"/> <!-- default -->
      </selector>
      

      <selector xmlns:android="http://schemas.android.com/apk/res/android">
         <item android:state_focused="true" android:color="?android:attr/colorPressedHighlight"/>
         <item android:state_enabled="false" android:color="@color/section_list_background" />
         <item android:color="@color/testcolor5"/>
       </selector>
      

      【讨论】:

      • 你检查了吗?尝试使用时出现错误:&lt;item android:state_pressed="true" android:drawable="?android:attr/colorPressedHighlight"/&gt;
      • 我只想说,如果你想要“item android:state_selected”,请使用你的状态,但使用 android:drawable 作为属性来设置颜色......
      猜你喜欢
      • 2015-07-23
      • 1970-01-01
      • 2021-07-28
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-05-25
      相关资源
      最近更新 更多