Android java.lang.IllegalStateException:指定的子级已具有父级
当我第一次实例化一个片段时,我使用的是片段。但是第二次我得到了这个例外。我找不到出错的线路了Android java.lang.IllegalStateException:指定的子级已具有父级,android,android-layout,android-fragments,Android,Android Layout,Android Fragments,当我第一次实例化一个片段时,我使用的是片段。但是第二次我得到了这个例外。我找不到出错的线路了 04-04 08:51:54.320: E/AndroidRuntime(29713): FATAL EXCEPTION: main 04-04 08:51:54.320: E/AndroidRuntime(29713): java.lang.IllegalStateException: The specified child already has a parent. You must ca
04-04 08:51:54.320: E/AndroidRuntime(29713): FATAL EXCEPTION: main
04-04 08:51:54.320: E/AndroidRuntime(29713): java.lang.IllegalStateException: The specified child already has a parent. You must call removeView() on the child's parent first.
04-04 08:51:54.320: E/AndroidRuntime(29713): at android.view.ViewGroup.addViewInner(ViewGroup.java:3013)
04-04 08:51:54.320: E/AndroidRuntime(29713): at android.view.ViewGroup.addView(ViewGroup.java:2902)
04-04 08:51:54.320: E/AndroidRuntime(29713): at android.view.ViewGroup.addView(ViewGroup.java:2859)
04-04 08:51:54.320: E/AndroidRuntime(29713): at android.view.ViewGroup.addView(ViewGroup.java:2839)
04-04 08:51:54.320: E/AndroidRuntime(29713): at android.support.v4.app.NoSaveStateFrameLayout.wrap(Unknown Source)
04-04 08:51:54.320: E/AndroidRuntime(29713): at android.support.v4.app.FragmentManagerImpl.moveToState(Unknown Source)
04-04 08:51:54.320: E/AndroidRuntime(29713): at android.support.v4.app.FragmentManagerImpl.moveToState(Unknown Source)
04-04 08:51:54.320: E/AndroidRuntime(29713): at android.support.v4.app.BackStackRecord.run(Unknown Source)
04-04 08:51:54.320: E/AndroidRuntime(29713): at android.support.v4.app.FragmentManagerImpl.execPendingActions(Unknown Source)
04-04 08:51:54.320: E/AndroidRuntime(29713): at android.support.v4.app.FragmentManagerImpl$1.run(Unknown Source)
04-04 08:51:54.320: E/AndroidRuntime(29713): at android.os.Handler.handleCallback(Handler.java:587)
04-04 08:51:54.320: E/AndroidRuntime(29713): at android.os.Handler.dispatchMessage(Handler.java:92)
04-04 08:51:54.320: E/AndroidRuntime(29713): at android.os.Looper.loop(Looper.java:132)
04-04 08:51:54.320: E/AndroidRuntime(29713): at android.app.ActivityThread.main(ActivityThread.java:4126)
04-04 08:51:54.320: E/AndroidRuntime(29713): at java.lang.reflect.Method.invokeNative(Native Method)
04-04 08:51:54.320: E/AndroidRuntime(29713): at java.lang.reflect.Method.invoke(Method.java:491)
04-04 08:51:54.320: E/AndroidRuntime(29713): at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:844)
04-04 08:51:54.320: E/AndroidRuntime(29713): at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:602)
04-04 08:51:54.320: E/AndroidRuntime(29713): at dalvik.system.NativeStart.main(Native Method)
下面是我单击列表片段中的一个元素时所做的操作
// If we are not currently showing a fragment for the new
// position, we need to create and install a new one.
RouteSearchFragment df = RouteSearchFragment.newInstance(index);
// Execute a transaction, replacing any existing fragment
// with this one inside the frame.
FragmentTransaction ft = fragmentManager.beginTransaction();
ft.replace(R.id.details_full, df);
ft.setTransition(FragmentTransaction.TRANSIT_FRAGMENT_FADE);
ft.commit();
第一次确定时,我从列表中单击element2,也可以;但当我回到元素1时,我发现了这个错误
谢谢大家 您正在将
视图
添加到版面
,但该视图已在另一个版面
中。视图不能位于多个位置。当您在RouteSearchFragment
类中重写OnCreateView
时,是否具有
if(view != null) {
return view;
}
代码段
如果是这样,删除return语句应该可以解决您的问题
如果不想重新生成视图数据,可以保留代码并返回视图,并且onDestroyView()方法可以从其父视图中删除此视图,如下所示:
@Override
public void onDestroyView() {
super.onDestroyView();
if (view != null) {
ViewGroup parent = (ViewGroup) view.getParent();
if (parent != null) {
parent.removeAllViews();
}
}
}
很抱歉,我发了一个老问题,但我能用一个完全不同的解决方案来解决它。我收到此异常,但我更改了onCreatView覆盖的第一行:
View result = inflater.inflate(R.layout.customer_layout, container);
……为此:
View result = inflater.inflate(R.layout.customer_layout, container, false);
我不知道为什么,但使用接受布尔值作为第三个参数的覆盖修复了它。我认为它告诉片段和/或活动不要使用“容器”作为新创建视图的父视图。我已经多次面临这个问题。 请添加以下代码以解决此问题:
@Override
public void onDestroyView() {
super.onDestroyView();
if (view != null) {
ViewGroup parentViewGroup = (ViewGroup) view.getParent();
if (parentViewGroup != null) {
parentViewGroup.removeAllViews();
}
}
}
谢谢我把这段代码放在一个片段中,如果我试图回到这个片段,它会崩溃
if (mRootView == null) {
mRootView = inflater.inflate(R.layout.fragment_main, container, false);
}
在收集了这条线索的答案后,我意识到mRootView的父母还是mRootView的孩子。所以,这是我的解决办法
if (mRootView == null) {
mRootView = inflater.inflate(R.layout.fragment_main, container, false);
} else {
((ViewGroup) mRootView.getParent()).removeView(mRootView);
}
希望这有帮助此解决方案可以帮助:
public class FragmentItem extends Android.Support.V4.App.Fragment
{
View rootView;
TextView textView;
public override View OnCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
if (rootView != null)
{
ViewGroup parent = (ViewGroup)rootView.Parent;
parent.RemoveView(rootView);
} else {
rootView = inflater.Inflate(Resource.Layout.FragmentItem, container, false);
textView = rootView.FindViewById<TextView>(Resource.Id.textViewDisplay);
}
return rootView;
}
}
public class FragmentItem扩展了Android.Support.V4.App.Fragment
{
视图根视图;
文本视图文本视图;
创建视图上的公共覆盖视图(布局、充气机、视图组容器、捆绑包保存状态){
if(rootView!=null)
{
ViewGroup parent=(ViewGroup)rootView.parent;
parent.RemoveView(rootView);
}否则{
rootView=充气机.充气(Resource.Layout.FragmentItem,container,false);
textView=rootView.findviewbyd(Resource.Id.textViewDisplay);
}
返回rootView;
}
}
如果您有此声明
View view = inflater.inflate(R.layout.fragment1, container);//may be Incorrect
那就试试这个。。添加false作为第三个参数。。也许这会有帮助
View view = inflater.inflate(R.layout.fragment1, container, false);//correct one
当onCreateView()返回的视图不是膨胀的视图时,也会发生这种情况 例如:
View rootView = inflater.inflate(R.layout.my_fragment, container, false);
TextView textView = (TextView) rootView.findViewById(R.id.text_view);
textView.setText("Some text.");
return textView;
修正: 而不是:
return textView; // or whatever you returned
我有这个问题,无法用Java代码解决。问题在于我的xml 我试图将textView添加到容器中,但已将textView包装在LinearLayout中 这是原始xml文件:
在xml文件中,您应该将包裹内容的布局宽度和布局高度设置为与父项匹配。这是为我准备的
<FrameLayout
android:id="@+id/container"
android:layout_width="match_parent"
android:layout_height="match_parent" />
我通过将
充气机的attachToRoot
设置为false
,解决了这个问题
public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
View view = inflater.inflate(R.layout.fragment_overview, container, false);
return view;
}
需要调用layoutView.removeAllViews();在将视图添加到之前layout@imrankhan错了!您可以添加而不删除所有。最重要的部分丢失了,因为stacktrace中没有自定义包,我建议您删除一些代码并逐步进行测试…我添加了更多详细信息,您能看到吗?这个RouteSearchFragment类是什么??在Android文档中找不到任何引用。请也更新类定义。我在问题中添加了更多详细信息,您能看到吗?@Override public void onDestroyView(){super.onDestroyView();ViewGroup parentViewGroup=(ViewGroup)mRoutesSearchViewContainer.getParent();if(null!=parentViewGroup){parentViewGroup.removeView(mRoutesSearchViewContainer)}@Medo:你能简单解释一下吗。我有相同的错误显示在日志猫。正如您提出的建议“删除return语句应该可以解决您的问题”,但我们需要在onCreateView()方法中返回视图对象。你能为你的解释提供代码片段吗。谢谢你。@Krishna只是像你平常一样膨胀并返回视图。你可以跳过整个if语句。对我来说,我只需要替换return inflater.inflate(R.layout.fragment\u search,container)代码>使用返回充气机。充气(R.layout.fragment\u搜索,容器,错误)代码>不要抱歉-这对我非常有用,显然对其他许多人也很有用。谢谢非常感谢,我总是忘记这一点,然后又回到这一点answer@Patrick,第一个将充气视图附加到容器,添加false标志表示您不想将充气视图添加到容器中。我一直回到这篇文章,发现这就是答案:)谢谢您的解决方案:)我有一个非常特殊的情况,我不能使用充气器来解决这个问题。你为我节省了很多时间对不起,我不太明白,因为我是android新手;视图对象从何而来?Cristy YG:将视图实例作为全局变量,并在上面的全局变量上膨胀布局xml。您是否在跟踪我?是的,查看实例声明为全局。+1帮助了我。如果您的活动保持不变,但片段管理器正在顶部添加新片段,则尤其如此。当它返回到第一个片段时,需要确保删除旧的根视图。谢谢这对我帮助很大。我三天来一直在寻找解决方案。简单而漂亮的答案。哇!我终于成功了!格拉特溶液。谢谢我没有理由解释为什么“(ViewGroup)mRootView.getParent()).removeView(mRootView);“与直接调用.removeView(mRootView)不同”,但这对我也有效,我正在Android 8.0和9.0上测试。谢谢bud^我认为rootView将始终为空,因为您没有这样做
public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
View view = inflater.inflate(R.layout.fragment_overview, container, false);
return view;
}