在布局中使用自定义属性会导致应用程序崩溃

Using custom attributes in layout crashes app

我正在构建一个 Android 应用程序,我正在尝试应用自定义主题,我想使用一些自定义属性。

我在 attrs.xml 中这样定义属性:

<resources>
    <attr name="baseColor" format="reference" />
    <attr name="accentColor" format="reference" />
</resources>

在我的 styles.xml 中,我已将以下值添加到我的主题中:

<style name="AppTheme" parent="Theme.AppCompat.Light.NoActionBar">
        <item name="windowActionBar">false</item>
        <item name="android:textColor">@android:color/black</item>
        <item name="android:windowNoTitle">true</item>
        <item name="colorAccent">@color/blue_color</item>
        <item name="android:colorPrimaryDark" tools:targetApi="lollipop">@color/blue_color</item>

        <item name="baseColor">@color/blue_color</item>
        <item name="accentColor">@color/red_color</item>
</style>

最后,在我的 XML 布局中,我将这些属性应用到按钮上:

<androidx.appcompat.widget.AppCompatButton
            android:id="@+id/sign_up_button"
            android:background="?attr/accentColor"
            android:textColor="?attr/baseColor"
            android:layout_width="match_parent"
            android:layout_height="40dp"
            android:text="@string/sign_up_button" />

但是,当我 运行 我的应用程序时,它崩溃并显示 java.lang.UnsupportedOperationException: Failed to resolve attribute at index 13: TypedValue{t=0x2/d=0x7f040046 a=-1} 这当然意味着找不到我的自定义属性。我错过了什么吗?我已经在我的主题中定义了颜色和属性,并且我已经将该主题应用于我清单中的 activity。可以找到完整的堆栈跟踪 here

对于您的自定义按钮,您需要在 attrs.xml

中声明样式
<?xml version="1.0" encoding="utf-8"?>
<resources>
  <declare-styleable name="UpdateButton">
    <attr name="setType" format="string" />
    <attr name="setContent" format="string"/>

  </declare-styleable>
</resources>

您的样式名称是您自定义视图的 Class 名称。

Creating a View Class

要构建自定义主题以扩展您的评论,您可以交换主题而不是使用 attrs.xml

Change Current Theme At Runtime - Whosebug

原来崩溃的 activity 使用了不同的主题,该主题没有自定义属性。我已经从清单中删除了自定义主题,并且属性按预期工作,因为它们是在我的应用程序的全局主题中定义的。