Ravi Bhandari
Ravi Bhandari

Reputation: 4698

Google map is not display when back button is clicked

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

Answers (2)

VenomVendor
VenomVendor

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

yahya
yahya

Reputation: 4860

I've created a library to make using mapFragment easier -as much as possible- you can have a look it here

But for a quick answer, i had the same problem so i wrote removing map fragment method (the one @VenomVendor mentioned) into onSaveInstanceState section.

Upvotes: 2

Related Questions