フラグメントを使用するのは、初めてフラグメントをインスタンス化するときです。しかし、2回目はこの例外が発生しました。エラーが発生した行が見つかりませんでしたか?
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();
初めてOKになったら、リストからelement2をクリックします。これもOKです。しかし、element1に戻ると、このバグが発生しました。
みんな、ありがとう!
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();
}
}
}
古い質問に投稿してすみませんが、まったく異なる解決策を使用して修正できました。私はこの例外を受け取っていましたが、onCreatViewオーバーライドの最初の行をこれから変更しました:
View result = inflater.inflate(R.layout.customer_layout, container);
...これに:
View result = inflater.inflate(R.layout.customer_layout, container, false);
理由はわかりませんが、3番目のパラメーターとしてブール値を受け入れるオーバーライドを使用して修正しました。フラグメントおよび/またはアクティビティに、「コンテナ」を新しく作成されたビューの親として使用しないよう指示していると思います。 HTH!
私はこの問題に何度も直面しています。この問題を解決するには、次のコードを追加してください。
@Override
public void onDestroyView() {
super.onDestroyView();
if (view != null) {
ViewGroup parentViewGroup = (ViewGroup) view.getParent();
if (parentViewGroup != null) {
parentViewGroup.removeAllViews();
}
}
}
ありがとう
このステートメントがある場合.
View view = inflater.inflate(R.layout.fragment1, container);//may be Incorrect
次に、これを試してください。3番目の引数としてfalseを追加します。
View view = inflater.inflate(R.layout.fragment1, container, false);//correct one
私はフラグメントにこのコードがあり、このフラグメントに戻ろうとするとクラッシュしました
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);
}
お役に立てれば
また、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 rootView;
の代わりに:
return textView; // or whatever you returned
この問題が発生したため、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>
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"/>
これは私にはあまり思えませんでしたが、トリックを行い、Javaコードをまったく変更しませんでした。すべてがxmlにありました。
View
をlayout
に追加していますが、ビューは既に別のlayout
にあります。ビューを複数の場所に配置することはできません。
このソリューションが役立ちます:
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;
}
}
inflater.inflate()
のattachToRoot
をfalse
に設定することで解決しました。
public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
View view = inflater.inflate(R.layout.fragment_overview, container, false);
return view;
}
xmlファイルで、wrap_contentのlayout_widthとlayout_heightをmatch_parentに設定する必要があります。それは私のために修正されました。
<FrameLayout
Android:id="@+id/container"
Android:layout_width="match_parent"
Android:layout_height="match_parent" />