在布局中使用自定义属性会导致应用程序崩溃
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 名称。
要构建自定义主题以扩展您的评论,您可以交换主题而不是使用 attrs.xml
Change Current Theme At Runtime - Whosebug
原来崩溃的 activity 使用了不同的主题,该主题没有自定义属性。我已经从清单中删除了自定义主题,并且属性按预期工作,因为它们是在我的应用程序的全局主题中定义的。
我正在构建一个 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 名称。
要构建自定义主题以扩展您的评论,您可以交换主题而不是使用 attrs.xml
Change Current Theme At Runtime - Whosebug
原来崩溃的 activity 使用了不同的主题,该主题没有自定义属性。我已经从清单中删除了自定义主题,并且属性按预期工作,因为它们是在我的应用程序的全局主题中定义的。