我有一个具有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)
答案 0 :(得分:1)
根据docs,当Android Gradle插件合并两个声明相同元素的清单文件时,它会检查它们的配置(即它们的XML标记和属性),以检查它们在两个清单中是否相同。如果他们是gradle只保留其中一个,如果他们不是gradle检测到冲突并将两个元素添加到清单。
由于您的两个片段大不相同,因此gradle正在将两者添加到最终应用中。然后在运行时,android抱怨它发现了两个具有相同 android:id 的片段并抛出了你看到的错误。
要解决此问题,您应该删除其中一个片段声明,或者对应用程序和库使它们相同。