资源覆盖

时间:2019-03-07 12:50:15

标签: android android-layout android-resources

我正在构建一个Android应用。它由两个模块组成。具体模块和核心模块。在核心模块中,我定义了基本的应用程序组件,样式和活动。在特定的示例中,我为每个客户进行自定义。

我的问题是我有一个在core > styles.xml > AppTheme > myAttr中定义的属性,我想在specific > styles.xml > MyAppTheme (which extends from AppTheme) > myAtrr中覆盖它。结果是,如果我在XML布局中使用?attr/myAttr,则该值始终是核心部分中的值,不会被特定的部分值覆盖。

如果我尝试使用getActivity().getTheme().obtainStyledAttributes()在代码中使用该属性,则结果是核心部分中的结果。

任何关于这里发生的事情的想法都很好,谢谢。

代码结构

我已经在核心styles.xml中定义了名为AppTheme的主题中的默认资源:

<resources>
    <style name="AppTheme" parent="@style/Theme.AppCompat.Light.NoActionBar">
        <item name="cat_commstate_loading_transition">@drawable/commstate_loading</item>
    </style>

    <attr name="cat_commstate_loading_transition" format="reference"/>
</resources>

commstate_loading.xml定义为:

<?xml version="1.0" encoding="utf-8"?>
<animation-list xmlns:android="http://schemas.android.com/apk/res/android"
    android:oneshot="false"
    android:visible="true">

    <item
        android:duration="225"
        android:drawable="@mipmap/commstate_loading_1"/>

    <item
        android:duration="225"
        android:drawable="@mipmap/commstate_loading_2"/>

    <item
        android:duration="225"
        android:drawable="@mipmap/commstate_loading_3"/>

</animation-list>

我使用这样的资源:

 <pl.droidsonroids.gif.GifImageView
            android:id="@+id/act_challenge_transition_loading_animation"
            android:layout_width="150dp"
            android:layout_height="150dp"
            android:theme="@style/MyAppTheme"
            android:layout_gravity="center"
            android:src="?attr/cat_commstate_loading_transition" />

所以,我有一个默认的动画,可以在多个项目中正常工作。

现在,在我想覆盖资源的情况下,我将在核心部分中定义的AppTheme扩展为特定的部分,如下所示:

<resources>
    <style name="MyAppTheme" parent="@style/AppTheme">
        <item name="cat_commstate_loading_transition">@drawable/commstate_loading_corporate</item>
    </style>
</resources>

commstate_loading_corporate资源是:

<?xml version="1.0" encoding="utf-8"?>
<animation-list xmlns:android="http://schemas.android.com/apk/res/android"
    android:oneshot="false"
    android:visible="true">

    <item
        android:duration="225"
        android:drawable="@mipmap/commstate_loading_corporate_1"/>

    <item
        android:duration="115"
        android:drawable="@mipmap/commstate_loading_corporate_2"/>

    <item
        android:duration="115"
        android:drawable="@mipmap/commstate_loading_corporate_3"/>

    <item
        android:duration="115"
        android:drawable="@mipmap/commstate_loading_corporate_4"/>

    <item
        android:duration="115"
        android:drawable="@mipmap/commstate_loading_corporate_5"/>

</animation-list>

根据我的观点,此时,引用?attr/cat_commstate_loading_transition应该引用commstate_loading_corporate资源,因为我将其覆盖。

1 个答案:

答案 0 :(得分:0)

我建议您使用product flavors。借助产品风格,您可以定义source sets并覆盖核心模块的任何部分(资源,资产,java源代码)。