Reputation: 4698
I am working on Google map api v2, integrated map successfully in fragment but getting error when back button is clicked.
I have 2 fragment i.e. 1. MapFragment 2. GalleryFragment, When user navigate to MapFragment and then from navigator drawer move to GalleryFragment and then press android back button then app force closed with error -
12-17 12:45:16.773: E/AndroidRuntime(15912): java.lang.IllegalStateException: The specified child already has a parent. You must call removeView() on the childs parent first.
12-17 12:45:16.773: E/AndroidRuntime(15912): at android.view.ViewGroup.addViewInner(ViewGroup.java:1976)
12-17 12:45:16.773: E/AndroidRuntime(15912): at android.view.ViewGroup.addView(ViewGroup.java:1871)
12-17 12:45:16.773: E/AndroidRuntime(15912): at android.view.ViewGroup.addView(ViewGroup.java:1828)
12-17 12:45:16.773: E/AndroidRuntime(15912): at android.view.ViewGroup.addView(ViewGroup.java:1808)
12-17 12:45:16.773: E/AndroidRuntime(15912): at android.support.v4.app.NoSaveStateFrameLayout.wrap(NoSaveStateFrameLayout.java:40)
12-17 12:45:16.773: E/AndroidRuntime(15912): at android.support.v4.app.FragmentManagerImpl.moveToState(FragmentManager.java:931)
12-17 12:45:16.773: E/AndroidRuntime(15912): at android.support.v4.app.FragmentManagerImpl.moveToState(FragmentManager.java:1104)
12-17 12:45:16.773: E/AndroidRuntime(15912): at android.support.v4.app.BackStackRecord.popFromBackStack(BackStackRecord.java:764)
12-17 12:45:16.773: E/AndroidRuntime(15912): at android.support.v4.app.FragmentManagerImpl.popBackStackState(FragmentManager.java:1516)
12-17 12:45:16.773: E/AndroidRuntime(15912): at android.support.v4.app.FragmentManagerImpl.popBackStackImmediate(FragmentManager.java:488)
12-17 12:45:16.773: E/AndroidRuntime(15912): at android.support.v4.app.FragmentActivity.onBackPressed(FragmentActivity.java:179)
12-17 12:45:16.773: E/AndroidRuntime(15912): at android.support.v7.app.ActionBarActivity.onBackPressed(ActionBarActivity.java:250)
12-17 12:45:16.773: E/AndroidRuntime(15912): at com.pehel.restaurant.MainActivity.onBackPressed(MainActivity.java:174)
12-17 12:45:16.773: E/AndroidRuntime(15912): at android.app.Activity.onKeyUp(Activity.java:1901)
12-17 12:45:16.773: E/AndroidRuntime(15912): at android.view.KeyEvent.dispatch(KeyEvent.java:1295)
12-17 12:45:16.773: E/AndroidRuntime(15912): at android.app.Activity.dispatchKeyEvent(Activity.java:2081)
12-17 12:45:16.773: E/AndroidRuntime(15912): at com.android.internal.policy.impl.PhoneWindow$DecorView.dispatchKeyEvent(PhoneWindow.java:1785)
12-17 12:45:16.773: E/AndroidRuntime(15912): at android.view.ViewRoot.deliverKeyEventToViewHierarchy(ViewRoot.java:2650)
12-17 12:45:16.773: E/AndroidRuntime(15912): at android.view.ViewRoot.handleFinishedEvent(ViewRoot.java:2625)
12-17 12:45:16.773: E/AndroidRuntime(15912): at android.view.ViewRoot.handleMessage(ViewRoot.java:1875)
12-17 12:45:16.773: E/AndroidRuntime(15912): at android.os.Handler.dispatchMessage(Handler.java:99)
12-17 12:45:16.773: E/AndroidRuntime(15912): at android.os.Looper.loop(Looper.java:130)
12-17 12:45:16.773: E/AndroidRuntime(15912): at android.app.ActivityThread.main(ActivityThread.java:3687)
12-17 12:45:16.773: E/AndroidRuntime(15912): at java.lang.reflect.Method.invokeNative(Native Method)
12-17 12:45:16.773: E/AndroidRuntime(15912): at java.lang.reflect.Method.invoke(Method.java:507)
12-17 12:45:16.773: E/AndroidRuntime(15912): at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:867)
12-17 12:45:16.773: E/AndroidRuntime(15912): at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:625)
12-17 12:45:16.773: E/AndroidRuntime(15912): at dalvik.system.NativeStart.main(Native Method)
I am using code in onCreateView of mapFragment:
if(v!=null){
ViewGroup parent = (ViewGroup) v.getParent();
if (parent != null)
parent.removeView(v);
} else {
v = inflater.inflate(R.layout.locate_us_fragment, container, false);
}
map = ((SupportMapFragment) getFragmentManager().findFragmentById(R.id.map))
.getMap();
and onDestroy:
SupportMapFragment fragment = ((SupportMapFragment) getFragmentManager().findFragmentById(R.id.map));
if(fragment!=null) {
FragmentTransaction ft = getActivity().getSupportFragmentManager().beginTransaction();
ft.remove(fragment);
ft.commit();
}
How to fix this problem,thanks in advance.
Upvotes: 0
Views: 1397
Reputation: 15382
Update :
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
Bundle savedInstanceState) {
if (container == null) {
return null;
}
if (view != null) {
ViewGroup parent = (ViewGroup) view.getParent();
if (parent != null)
parent.removeView(view);
}
try {
view = inflater.inflate(R.layout.map, container, false);
setUpMapIfNeeded();
} catch (InflateException e) {
Log.wtf("*****", e.getMessage());
}
return view;
}
You have to kill the fragment.
@Override
public void onDestroyView() {
super.onDestroyView();
FragmentManager fm = getActivity().getSupportFragmentManager();
Fragment fragment = (fm.findFragmentById(R.id.mapd));
FragmentTransaction ft = fm.beginTransaction();
ft.remove(fragment);
ft.commit();
}
Upvotes: 1