Java.lang.IllegalStateException: указанный дочерний элемент уже имеет родителя
Я использую фрагменты, когда я создаю фрагмент в первый раз. но во второй раз я получил это исключение. Я не мог найти строку, где я получил ошибку?
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 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, я получил эту ошибку.
Спасибо каждому!
Ответы
Ответ 1
Когда вы переопределяете OnCreateView
в своем классе RouteSearchFragment
, у вас есть
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();
}
}
}
Ответ 2
Извините, что публиковал старый вопрос, но я смог его исправить, используя совершенно другое решение. Я получал это исключение, но я изменил первую строку моего переопределения onCreatView:
View result = inflater.inflate(R.layout.customer_layout, container);
... к этому:
View result = inflater.inflate(R.layout.customer_layout, container, false);
Я понятия не имею, почему, но используя переопределение, которое принимает логическое значение, поскольку третий параметр исправил его. Я думаю, что он говорит Фрагменту и/или Деянию не использовать "контейнер" в качестве родителя недавно созданного представления. НТН!
Ответ 3
Я сталкиваюсь с этой проблемой много раз.
Добавьте следующий код для решения этой проблемы:
@Override
public void onDestroyView() {
super.onDestroyView();
if (view != null) {
ViewGroup parentViewGroup = (ViewGroup) view.getParent();
if (parentViewGroup != null) {
parentViewGroup.removeAllViews();
}
}
}
Спасибо
Ответ 4
Если у вас есть это утверждение..
View view = inflater.inflate(R.layout.fragment1, container);//may be Incorrect
Затем попробуйте это. Добавьте false как третий аргумент. Может быть, это может помочь.
View view = inflater.inflate(R.layout.fragment1, container, false);//correct one
Ответ 5
У меня был этот код во фрагменте, и он сбой, если я попытаюсь вернуться к этому фрагменту
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);
}
надеюсь, что это поможет
Ответ 6
Это также происходит, когда представление, возвращаемое 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;
Fix:
return rootView;
Вместо:
return textView; // or whatever you returned
Ответ 7
У меня была эта проблема и я не мог ее решить в Java-коде. Проблема была в моем xml.
Я пытался добавить textView в контейнер, но обернул textView внутри LinearLayout.
Это был исходный файл 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>
Ответ 8
Вы добавляете View
в layout
, но представление уже находится в другом layout
. Вид не может находиться в нескольких местах.
Ответ 9
Это решение может помочь:
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;
}
}