【问题标题】:Unable to use ?customColor in drawable无法在可绘制对象中使用 ?customColor
【发布时间】:2018-03-07 14:31:12
【问题描述】:

我正在尝试为我的应用主题定义自定义颜色。 这是我的做法:

定义自定义属性:

<declare-styleable name="ApplicationStyle">
    <attr name="colorWeekdaysBg" format="color"/>
</declare-styleable>

定义应用风格:

<style name="ApplicationStyle" parent="Theme.AppCompat.NoActionBar">
    <item name="android:editTextStyle">@style/EditTextStyle</item>
    <item name="colorPrimaryDark">@color/dark_blue</item>
    <item name="colorPrimary">@color/dark_blue</item>
    <item name="colorAccent">@color/dark_blue</item>
    <item name="colorWeekdaysBg">@color/access_weekdays</item>
</style>

在清单中设置样式:

<application
    android:name=".App"
    android:icon="@drawable/icon_launcher"
    android:label="@string/app_name"
    android:theme="@style/ApplicationStyle">

在drawable xml中使用这个属性:

<layer-list xmlns:android="http://schemas.android.com/apk/res/android">
    <item android:right="-1dp">
        <shape android:shape="rectangle">
            <stroke
                android:width="1dp"
                android:color="?colorWeekdaysBg" />

            <corners
                android:bottomLeftRadius="100dp"
                android:topLeftRadius="100dp" />

        </shape>
    </item>
</layer-list>

但由于某种原因,它不会将我的颜色应用于可绘制对象。它改为应用透明颜色。

更奇怪的是,如果我用?colorAccent(在Theme.AppCompat 中定义)替换我的?colorWeekdaysBg,那么它会应用正确的颜色。

所以最后的问题是:你知道为什么它不起作用,以及如何解决它吗?

【问题讨论】:

  • 你在哪里设置 colorWeekdaysBg 的颜色?在 colors.xml 中名为“access_weekdays”的变量中?
  • @Antonio 完全正确
  • 您是否尝试在可绘制的 xml 中使用“@color/access_weekdays”?让我们尝试找出应用失去颜色的地方。
  • 是的,这就是我在决定将其移至主题之前的使用方式

标签: android android-drawable android-styles android-color


【解决方案1】:

根据 mudit here 的回答,这是棒棒糖前操作系统中的一个错误。
举报于Google's Issue Tracker

在Android Lollipop及以上操作系统的设备上可以正常工作。

检查以下代码:

attr.xml

<declare-styleable name="AppTheme">
        <attr name="colorWeekdaysBg" format="color|reference" /> <!-- Or you can keep color only. It will be ok -->
    </declare-styleable>

您必须在 v21 样式文件中设置属性。 可能你错过了这个。
v21\styles.xml

<!-- Base application theme. -->
    <style name="AppTheme" parent="Theme.AppCompat.Light.DarkActionBar">
        <!-- Customize your theme here. -->
        <item name="colorPrimary">@color/colorPrimary</item>
        <item name="colorPrimaryDark">@color/colorPrimaryDark</item>
        <item name="colorAccent">@color/colorAccent</item>
        <item name="android:splitMotionEvents">false</item>
        <item name="windowActionBar">false</item>
        <item name="windowNoTitle">true</item>
        <item name="android:navigationBarColor">@color/black</item>
        <item name="colorWeekdaysBg">@color/access_weekdays</item>
    </style>

创建两个可绘制文件以使其适用于所有设备。一个用于普通版本,即棒棒糖前版本,另一个用于棒棒糖及更高版本,即 v21 可绘制。

your_drawable.xml 在此您必须从颜色文件中设置颜色。

<layer-list xmlns:android="http://schemas.android.com/apk/res/android">
    <item android:right="-1dp">
        <shape android:shape="rectangle">
            <stroke
                android:width="1dp"
                android:color="@color/access_weekdays" />
            <corners
                android:bottomLeftRadius="100dp"
                android:topLeftRadius="100dp" />
        </shape>
    </item>
</layer-list>

v21\your_drawable.xml 在此文件中,您可以像以前一样设置自定义属性。

<layer-list xmlns:android="http://schemas.android.com/apk/res/android">
    <item android:right="-1dp">
        <shape android:shape="rectangle">
            <stroke
                android:width="1dp"
                android:color="?colorWeekdaysBg" />
            <corners
                android:bottomLeftRadius="100dp"
                android:topLeftRadius="100dp" />
        </shape>
    </item>
</layer-list>

your_layout.xml 在您的布局中,您可以如下所示提供该可绘制对象

<Button
    android:id="@+id/btnTest"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:background="@drawable/your_drawable"
    android:text="Test Text" />

现在检查您的问题的答案。

但由于某种原因,它不会将我的颜色应用于可绘制对象。它改为应用透明颜色。

  • 因为您可能没有在 v21 style.xml 文件中定义您的属性

更奇怪的是,如果我用 Theme.AppCompat 中定义的?colorAccent 替换我的?colorWeekdaysBg,那么它会应用正确的颜色。

  • Android Studio 在预览中显示颜色,但是当您运行应用程序并到达该屏幕时,您的应用程序将崩溃并出现 Error inflating class 错误
    android.view.InflateException: Binary XML file line #68: Error inflating class Button

所以最后的问题是:你知道为什么它不起作用,以及如何解决它吗?

  • 我想您现在已经知道为什么它不起作用以及如何解决它了。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-07-10
    • 2020-04-25
    • 2020-09-22
    • 1970-01-01
    • 1970-01-01
    • 2013-07-20
    相关资源
    最近更新 更多