覆盖库项目中的资源

时间:2014-10-12 14:53:33

标签: android-layout android-fragments android-gradle

我有一个具有Default Fragment实现的库项目。我还添加了一些模板方法,主项目可以挂钩并返回另一个要膨胀的布局资源ID。我得到的问题是运行时看到重复的ID。我想知道如何避免这种情况?

@IdRes
@Override
public int getDrawerLayoutResID() {
    return R.id.drawerLayout;
}

@LayoutRes
@Override
public int getLayoutResID() {
    return R.layout.master_detail;
}

Lib Project:

 BaseFragment
 layout.xml

主要项目:

 ConcreteFragment
 layout.xml

我只从嵌套片段中知道这个问题。但我不使用任何嵌套的碎片。 我检查了生成的R文件,它们都包含相同ID(布局和抽屉)的相同ID。

AFAIK资源合并应该覆盖与库项目中的layout.xml具有相同名称的资源。

我想要的只是主项目的某种类型的自定义,因为大多数代码都在库项目中得到支持。要存档此自定义,我有一个布局文件,它是Activiy布局的一部分:

图书馆计划文件:

<!-- The navigation drawer -->
<fragment
    android:name="com.examle.core.ui.fragment.NavigationDrawerFragment"
    android:id="@+id/left_drawer"
    android:layout_width="240dp"
    android:layout_height="match_parent"
    android:layout_gravity="start"
    tools:layout="@layout/fragment_navigation" />

具体项目文件:

<!-- The navigation drawer -->
<fragment
    android:name="com.examle.ui.fragment.ConcreteFragment"
    android:id="@+id/left_drawer"
    android:layout_width="240dp"
    android:layout_height="match_parent"
    android:layout_gravity="start"
    tools:layout="@layout/fragment_navigation" />

当我在具有期望的活动中调用setContentView时,运行时失败:

堆栈跟踪:

 Caused by: java.lang.IllegalArgumentException: Binary XML file line #45: Duplicate id 0x7f08006d, tag null, or parent id 0x7f08006b with another fragment for com.example.android.fragment.ConcreteFragment
        at android.app.Activity.onCreateView(Activity.java:4751)

1 个答案:

答案 0 :(得分:1)

根据docs,当Android Gradle插件合并两个声明相同元素的清单文件时,它会检查它们的配置(即它们的XML标记和属性),以检查它们在两个清单中是否相同。如果他们是gradle只保留其中一个,如果他们不是gradle检测到冲突并将两个元素添加到清单。

由于您的两个片段大不相同,因此gradle正在将两者添加到最终应用中。然后在运行时,android抱怨它发现了两个具有相同 android:id 的片段并抛出了你看到的错误。

要解决此问题,您应该删除其中一个片段声明,或者对应用程序和库使它们相同。