不能在可绘制对象中使用主题属性。出现 android.content.res.Resources$NotFoundException 错误

Cannot use theme attributes in a drawable. Got android.content.res.Resources$NotFoundException error

我得到了以下可绘制的形状:

<shape xmlns:android="http://schemas.android.com/apk/res/android" android:shape="rectangle" >
    <solid android:color="#222222" />
    <stroke android:width="1dip" android:color="?attr/colorPrimary"/>
    <corners
        android:topLeftRadius="58dp"
        android:topRightRadius="58dp"
        android:bottomRightRadius="58dp"
        android:bottomLeftRadius="58dp">
    </corners>
    <padding
        android:left="4dp"
        android:top="4dp"
        android:right="4dp"
        android:bottom="4dp" />
</shape>

我在这一行中设置主题的颜色属性:

<stroke android:width="1dip" android:color="?attr/colorPrimary"/>

项目编译正常,没有任何问题,但在 运行设备上的时间里我遇到了以下问题:

    android.view.InflateException: Binary XML file line #119: Error inflating class TextView
    ...
    Caused by: android.content.res.Resources$NotFoundException: File
 res/drawable/bordered_green_solid_textview.xml from drawable resource ID #0x7f07006a

当我替换 ?attr/colorPrimary 并使用例如 #222222 这样的十六进制颜色时,它将 运行没问题。

我应该怎么做才能在我的可绘制对象中毫无问题地使用 ?attrs

P.S.: 我最小 API 19 级

我的TextView:

<TextView android:id="@+id/imagesCounter"
            android:layout_width="20dp"
            android:layout_height="20dp"
            android:layout_marginLeft="35dp"
            android:layout_marginBottom="35dp"
            android:background="@drawable/bordered_green_solid_textview"
            android:gravity="center"
            android:text="16"
            android:textColor="?attr/colorPrimary"
            android:textSize="9sp"
            app:layout_constraintBottom_toBottomOf="@+id/imageBorder"
            app:layout_constraintStart_toStartOf="@+id/imageBorder"
            tools:text="67" />

是使用颜色值中的颜色或使用十六进制颜色的更好方法。 如果你必须使用 ?attr 值:

  1. 你应该定义颜色
  2. 创建文件res/value/attrs.xml
  3. 在样式中定义颜色并为属性设置值
  4. 在 drawble 中使用你的属性

为什么必须使用 ?attr

直接打电话

android:color="?colorPrimary"

您不能在 API 21.

下面的 XML drawable 中引用属性

尝试替换

<stroke android:color="?attr/colorPrimary" />

<stroke android:color="@color/colorPrimary" />

毕竟我发现对于像 19 这样的 API 级别,唯一可能的方法是为应用程序的不同主题制作单独的可绘制对象。

所以首先你需要在 values/attrs.xml:

中声明你的可绘制对象的新属性
<?xml version="1.0" encoding="utf-8"?>
<resources>
    ...
    <attr name="nav_bar_header_drawable" format="reference"/>
     ...
</resources>

那么在你的主题中,你应该为这个属性设置可绘制的,现在你可以在任何你想要的地方引用它。

<style name="Theme.MyDarkMaterialDesign" parent="Theme.MaterialComponents.NoActionBar">
        ...
        <item name="nav_bar_header_drawable">@drawable/side_nav_bar</item>
       ...
    </style>

它非常适合 API 19 并且可能低于(没有测试,因为我只需要 19 API 及以上)。