I am using fragments, when I instantiate a fragment the first time it it. but the second time I got this exception. I couldn't find the line where I got the error?
我正在使用片段,当我第一次实例化片段时。但第二次我得到了这个例外。我找不到出错的地方?
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)
Here are what i do when i click on an element of my list fragment.
这是我点击列表片段的元素时所做的事情。
// 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();
The first time it is Ok, I click element2 from list, it's also ok; but when I return to element1 I got this bug.
第一次它是Ok,我从列表中单击element2,它也没关系;但是当我回到element1时,我遇到了这个bug。
Thanks every one!
感谢大家!
10 个解决方案
#1
27
When you override OnCreateView
in your RouteSearchFragment
class, do you have the
当你在RouteSearchFragment类中重写OnCreateView时,你有吗?
if(view != null) {
return view;
}
code segment?
代码段?
If so, removing the return statement should solve your problem.
如果是这样,删除return语句应该可以解决您的问题。
You can keep the code and return the view if you don't want to regenerate view data, and onDestroyView() method you remove this view from its parent like so:
如果您不想重新生成视图数据,可以保留代码并返回视图,而如果您从父节点中删除此视图,则可以使用onDestroyView()方法:
@Override
public void onDestroyView() {
super.onDestroyView();
if (view != null) {
ViewGroup parent = (ViewGroup) view.getParent();
if (parent != null) {
parent.removeAllViews();
}
}
}
#2
355
Sorry to post to an old question but I was able to fix it using a totally different solution. I was getting this exception but I changed the first line of my onCreatView override from this:
很抱歉发布一个旧问题,但我能够使用完全不同的解决方案来修复它。我得到了这个异常,但我改变了我的onCreatView覆盖的第一行:
View result = inflater.inflate(R.layout.customer_layout, container);
...to this:
......对此:
View result = inflater.inflate(R.layout.customer_layout, container, false);
I have no idea why but using the override that accepts the boolean as the third param fixed it. I think it tells the Fragment and/or Activity not to use the "container" as the parent of the newly-created View. HTH!
我不知道为什么但是使用接受布尔值的覆盖作为第三个参数修复它。我认为它告诉Fragment和/或Activity不要使用“容器”作为新创建的View的父级。 HTH!
#3
42
I have facing this issue many time. Please add following code for resolve this issue :
我多次面对这个问题。请添加以下代码以解决此问题:
@Override
public void onDestroyView() {
super.onDestroyView();
if (view != null) {
ViewGroup parentViewGroup = (ViewGroup) view.getParent();
if (parentViewGroup != null) {
parentViewGroup.removeAllViews();
}
}
}
Thanks
谢谢
#4
34
If you have this statement..
如果你有这个说法..
View view = inflater.inflate(R.layout.fragment1, container);//may be Incorrect
Then try this.. Add false as third argument.. May be it could help..
然后尝试这个..添加false作为第三个参数..可能它可以帮助..
View view = inflater.inflate(R.layout.fragment1, container, false);//correct one
#5
20
I had this code in a fragment and it was crashing if I try to come back to this fragment
我在片段中有这个代码,如果我试图回到这个片段,它就会崩溃
if (mRootView == null) {
mRootView = inflater.inflate(R.layout.fragment_main, container, false);
}
after gathering the answers on this thread, I realised that mRootView's parent still have mRootView as child. So, this was my fix.
在收集了这个帖子的答案之后,我意识到mRootView的父级仍然有mRootView作为孩子。所以,这是我的修复。
if (mRootView == null) {
mRootView = inflater.inflate(R.layout.fragment_main, container, false);
} else {
((ViewGroup) mRootView.getParent()).removeView(mRootView);
}
hope this helps
希望这可以帮助
#6
14
It also happens when the view returned by onCreateView() isn't the view that was inflated.
当onCreateView()返回的视图不是被夸大的视图时,也会发生这种情况。
Example:
例:
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;
Fix:
固定:
return rootView;
Instead of:
代替:
return textView; // or whatever you returned
#7
5
I had this problem and couldn't solve it in Java code. The problem was with my xml.
我有这个问题,无法用Java代码解决它。问题出在我的xml上。
I was trying to add a textView to a container, but had wrapped the textView inside a LinearLayout.
我试图将textView添加到容器中,但是已将textView包装在LinearLayout中。
This was the original xml file:
这是原始的xml文件:
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:orientation="vertical"
android:layout_width="match_parent"
android:layout_height="match_parent">
<TextView xmlns:android="http://schemas.android.com/apk/res/android"
android:id="@android:id/text1"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:textAppearance="?android:attr/textAppearanceListItemSmall"
android:gravity="center_vertical"
android:paddingLeft="16dp"
android:paddingRight="16dp"
android:textColor="#fff"
android:background="?android:attr/activatedBackgroundIndicator"
android:minHeight="?android:attr/listPreferredItemHeightSmall"/>
</LinearLayout>
Now with the LinearLayout removed:
现在删除了LinearLayout:
<TextView xmlns:android="http://schemas.android.com/apk/res/android"
android:id="@android:id/text1"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:textAppearance="?android:attr/textAppearanceListItemSmall"
android:gravity="center_vertical"
android:paddingLeft="16dp"
android:paddingRight="16dp"
android:textColor="#fff"
android:background="?android:attr/activatedBackgroundIndicator"
android:minHeight="?android:attr/listPreferredItemHeightSmall"/>
This didn't seem like much to me but it did the trick, and I didn't change my Java code at all. It was all in the xml.
这对我来说似乎并不多,但它确实起了作用,我根本没有改变我的Java代码。它全部在xml中。
#8
2
You are adding a View
into a layout
, but the View already is in another layout
. A View can't be in more than one place.
您正在将一个视图添加到布局中,但视图已经在另一个布局中。视图不能在多个位置。
#9
1
This solution can help :
此解决方案可以帮助:
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;
}
}
#10
0
in your xml file you should set layout_width and layout_height from wrap_content to match_parent. it's fixed for me.
在xml文件中,您应该将layout_content和layout_height从wrap_content设置为match_parent。这对我来说是固定的。
<FrameLayout
android:id="@+id/container"
android:layout_width="match_parent"
android:layout_height="match_parent" />
#1
27
When you override OnCreateView
in your RouteSearchFragment
class, do you have the
当你在RouteSearchFragment类中重写OnCreateView时,你有吗?
if(view != null) {
return view;
}
code segment?
代码段?
If so, removing the return statement should solve your problem.
如果是这样,删除return语句应该可以解决您的问题。
You can keep the code and return the view if you don't want to regenerate view data, and onDestroyView() method you remove this view from its parent like so:
如果您不想重新生成视图数据,可以保留代码并返回视图,而如果您从父节点中删除此视图,则可以使用onDestroyView()方法:
@Override
public void onDestroyView() {
super.onDestroyView();
if (view != null) {
ViewGroup parent = (ViewGroup) view.getParent();
if (parent != null) {
parent.removeAllViews();
}
}
}
#2
355
Sorry to post to an old question but I was able to fix it using a totally different solution. I was getting this exception but I changed the first line of my onCreatView override from this:
很抱歉发布一个旧问题,但我能够使用完全不同的解决方案来修复它。我得到了这个异常,但我改变了我的onCreatView覆盖的第一行:
View result = inflater.inflate(R.layout.customer_layout, container);
...to this:
......对此:
View result = inflater.inflate(R.layout.customer_layout, container, false);
I have no idea why but using the override that accepts the boolean as the third param fixed it. I think it tells the Fragment and/or Activity not to use the "container" as the parent of the newly-created View. HTH!
我不知道为什么但是使用接受布尔值的覆盖作为第三个参数修复它。我认为它告诉Fragment和/或Activity不要使用“容器”作为新创建的View的父级。 HTH!
#3
42
I have facing this issue many time. Please add following code for resolve this issue :
我多次面对这个问题。请添加以下代码以解决此问题:
@Override
public void onDestroyView() {
super.onDestroyView();
if (view != null) {
ViewGroup parentViewGroup = (ViewGroup) view.getParent();
if (parentViewGroup != null) {
parentViewGroup.removeAllViews();
}
}
}
Thanks
谢谢
#4
34
If you have this statement..
如果你有这个说法..
View view = inflater.inflate(R.layout.fragment1, container);//may be Incorrect
Then try this.. Add false as third argument.. May be it could help..
然后尝试这个..添加false作为第三个参数..可能它可以帮助..
View view = inflater.inflate(R.layout.fragment1, container, false);//correct one
#5
20
I had this code in a fragment and it was crashing if I try to come back to this fragment
我在片段中有这个代码,如果我试图回到这个片段,它就会崩溃
if (mRootView == null) {
mRootView = inflater.inflate(R.layout.fragment_main, container, false);
}
after gathering the answers on this thread, I realised that mRootView's parent still have mRootView as child. So, this was my fix.
在收集了这个帖子的答案之后,我意识到mRootView的父级仍然有mRootView作为孩子。所以,这是我的修复。
if (mRootView == null) {
mRootView = inflater.inflate(R.layout.fragment_main, container, false);
} else {
((ViewGroup) mRootView.getParent()).removeView(mRootView);
}
hope this helps
希望这可以帮助
#6
14
It also happens when the view returned by onCreateView() isn't the view that was inflated.
当onCreateView()返回的视图不是被夸大的视图时,也会发生这种情况。
Example:
例:
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;
Fix:
固定:
return rootView;
Instead of:
代替:
return textView; // or whatever you returned
#7
5
I had this problem and couldn't solve it in Java code. The problem was with my xml.
我有这个问题,无法用Java代码解决它。问题出在我的xml上。
I was trying to add a textView to a container, but had wrapped the textView inside a LinearLayout.
我试图将textView添加到容器中,但是已将textView包装在LinearLayout中。
This was the original xml file:
这是原始的xml文件:
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:orientation="vertical"
android:layout_width="match_parent"
android:layout_height="match_parent">
<TextView xmlns:android="http://schemas.android.com/apk/res/android"
android:id="@android:id/text1"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:textAppearance="?android:attr/textAppearanceListItemSmall"
android:gravity="center_vertical"
android:paddingLeft="16dp"
android:paddingRight="16dp"
android:textColor="#fff"
android:background="?android:attr/activatedBackgroundIndicator"
android:minHeight="?android:attr/listPreferredItemHeightSmall"/>
</LinearLayout>
Now with the LinearLayout removed:
现在删除了LinearLayout:
<TextView xmlns:android="http://schemas.android.com/apk/res/android"
android:id="@android:id/text1"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:textAppearance="?android:attr/textAppearanceListItemSmall"
android:gravity="center_vertical"
android:paddingLeft="16dp"
android:paddingRight="16dp"
android:textColor="#fff"
android:background="?android:attr/activatedBackgroundIndicator"
android:minHeight="?android:attr/listPreferredItemHeightSmall"/>
This didn't seem like much to me but it did the trick, and I didn't change my Java code at all. It was all in the xml.
这对我来说似乎并不多,但它确实起了作用,我根本没有改变我的Java代码。它全部在xml中。
#8
2
You are adding a View
into a layout
, but the View already is in another layout
. A View can't be in more than one place.
您正在将一个视图添加到布局中,但视图已经在另一个布局中。视图不能在多个位置。
#9
1
This solution can help :
此解决方案可以帮助:
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;
}
}
#10
0
in your xml file you should set layout_width and layout_height from wrap_content to match_parent. it's fixed for me.
在xml文件中,您应该将layout_content和layout_height从wrap_content设置为match_parent。这对我来说是固定的。
<FrameLayout
android:id="@+id/container"
android:layout_width="match_parent"
android:layout_height="match_parent" />