不能在可绘制对象中使用主题属性。出现 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 值:
- 你应该定义颜色
- 创建文件res/value/attrs.xml
- 在样式中定义颜色并为属性设置值
- 在 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 及以上)。
我得到了以下可绘制的形状:
<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 值:
- 你应该定义颜色
- 创建文件res/value/attrs.xml
- 在样式中定义颜色并为属性设置值
- 在 drawble 中使用你的属性
为什么必须使用 ?attr
直接打电话
android:color="?colorPrimary"
您不能在 API 21.
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 及以上)。