Java &引用;重复id、标记null或父id 0x0,带有另一个片段;向ActionBarActivity添加第二个片段时
当我尝试在主ActionBarActivity中添加新片段时,我收到一个“java.lang.IllegalArgumentException:二进制XML文件行#3:重复id 0x7f05003f、标记null或父id 0x0和另一个片段”错误 主要错误是一个android.view.InflateException:Binary XML文件行#3:error Explling class fragment error,位于my PlaceDetails fragment类的返回行上 目标:在第一个SupportMapFragment之上获得第二个片段,覆盖率约为30% main.javaJava &引用;重复id、标记null或父id 0x0,带有另一个片段;向ActionBarActivity添加第二个片段时,java,android,android-fragments,android-actionbar,illegalargumentexception,Java,Android,Android Fragments,Android Actionbar,Illegalargumentexception,当我尝试在主ActionBarActivity中添加新片段时,我收到一个“java.lang.IllegalArgumentException:二进制XML文件行#3:重复id 0x7f05003f、标记null或父id 0x0和另一个片段”错误 主要错误是一个android.view.InflateException:Binary XML文件行#3:error Explling class fragment error,位于my PlaceDetails fragment类的返回行上 目标:在
public class Main extends ActionBarActivity{
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
if (findViewById(R.id.fragment_container) != null) {
if (savedInstanceState != null) {
return;
}
FragmentTransaction mTransaction = getSupportFragmentManager()
.beginTransaction();
SupportMapFragment mapFragmentSupportClass = new MapFragmentClass();
mTransaction.add(R.id.fragment_container, mapFragmentSupportClass);
mTransaction.commit();
FragmentTransaction xTransaction = getSupportFragmentManager().beginTransaction();
PlaceDetailsFragment placeDetailsFragment = new PlaceDetailsFragment();
xTransaction.add(R.id.fragment_container, placeDetailsFragment);
xTransaction.commit();
}
}
PlaceDetailsFragment.java这是应用程序崩溃的地方,在返回行中
import android.os.Bundle;
import android.support.v4.app.Fragment;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
public class PlaceDetailsFragment extends Fragment {
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
Bundle savedInstanceState) {
return inflater.inflate(R.layout.details, container, false);
}
}
main.xml
<FrameLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:id="@+id/fragment_container"
android:layout_width="match_parent"
android:layout_height="match_parent" >
</FrameLayout>
mapfragment.xml
<fragment xmlns:android="http://schemas.android.com/apk/res/android"
android:id="@+id/map"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:name="com.google.android.gms.maps.MapFragment"
/>
details.xml
<fragment xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="200dp"
android:id="@+id/details"
android:name="com.qstudios.whatsopenlate.PlaceDetailsFragment"
android:tag="detailsTag"
/>
据我所知,我没有使用重复id的nor标记,因此留下了片段与mapFragment(main的fragment_容器)共享的父id。为什么这是一个问题。父项具有相同的ID不符合逻辑吗?而且,这不是嵌套片段,对吗?我正在使用ActionBarActivity和FrameLayout来放置片段
这个错误已经让我的工作效率停滞不前了2个小时,我在谷歌上找到的所有答案都是关于ActionBarSherlock、嵌套片段等。没有人能提供一个简单的解释或示例来说明如何在框架布局中适当地放置2个片段。甚至没有解释怎么做
有没有人有过这样的经历,知道我做错了什么,我怎样才能纠正它
提前谢谢 问题在于details.xml中使用
标记的方式,正如您或多或少发现的那样。根据安卓系统:
活动的布局XML可以包含
标记,以将片段实例嵌入布局中
基本上,您试图使用标记作为片段的实际布局,而它所要做的只是将现有片段(已经有自己的布局)嵌入到其他视图中。因此,正确的解决方案确实是为片段构建布局(例如注释中提到的RelativeLayout),而不使用
然后,如果要将创建的片段添加到其他布局(如main.xml),可以使用
引用它。例如,main.xml可以重写为:
<FrameLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:id="@+id/fragment_container"
android:layout_width="match_parent"
android:layout_height="match_parent" >
<fragment
android:layout_width="match_parent"
android:layout_height="200dp"
android:id="@+id/details"
android:name="com.qstudios.whatsopenlate.PlaceDetailsFragment"
android:tag="detailsTag" />
</FrameLayout>
但是,如果您选择使用FragmentManager以编程方式添加片段(正如您所做的那样),则根本不需要使用标记
API指南(特别是关于向活动添加片段的部分)对此进行了很好的解释,我强烈建议您阅读。大体上,如果将framelayout更改为relativelayout,会发生什么?(或者,好奇的是,如果您尝试在地图片段之前添加细节片段,会发生什么情况。您会得到相同的错误,但指向地图片段代码中的充气机吗?)好奇的是,如果“片段”标记替换为FrameLayout标记,会发生什么情况?只是为了排除重复的ID,如果您将details id更改为detailsXYZ,会发生什么情况?当您查看生成的资源文件夹(导航到id)时,会调用重建,0x7f05003f对应什么?如果有机会,我可能会尝试复制您在我这方面看到的问题。
FragmentTransaction xTransaction = getSupportFragmentManager().beginTransaction();
PlaceDetailsFragment placeDetailsFragment = new PlaceDetailsFragment();
xTransaction.add(R.id.fragment_container, placeDetailsFragment);
xTransaction.commit();