无法在drawable中使用?customColor

时间:2018-03-07 14:31:12

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

我试图为我应用的主题定义自定义颜色。 我是这样做的:

定义自定义属性:

<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>

但由于某种原因,它不会将我的颜色应用于drawable。它适用于透明色。

另一个奇怪的事情是,如果我将?colorWeekdaysBg替换为?colorAccent({1}}中定义的Theme.AppCompat,那么它会应用正确的颜色。

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

1 个答案:

答案 0 :(得分:0)

根据 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文件
  • 中定义属性
  

另一件事是,如果我将?colorWeekdaysBg替换为?colorAccent(在Theme.AppCompat中定义),那么它将应用正确的颜色。

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

最后是一个问题:您是否知道为什么它不起作用以及如何解决?

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