studio mapa google geolocalizacion fragmento example android android-fragments android-activity mapfragment supportmapfragment

android - geolocalizacion - Cambio de fragmentos-Fragmento de mapa de Google V2-Se destruyó la actividad Error



map fragment android studio (1)

Tengo una actividad de Maps (SherlockFragmentActivity) que se carga en un fragmento de Maps que tiene 2 botones e interruptores entre mostrar 2 fragmentos diferentes (GoogleMapFragment & ScaleImageViewFragment)

Cuando hago clic en el botón del mapa del expositor, este reemplaza el fragmento, sin embargo, cuando hago clic atrás, aparece el error "java.lang.IllegalStateException: Activity has has destroyed".

ERROR/AndroidRuntime(5768): FATAL EXCEPTION: main java.lang.IllegalStateException: Activity has been destroyed at android.support.v4.app.FragmentManagerImpl.enqueueAction(FragmentManager.java:1342) at android.support.v4.app.BackStackRecord.commitInternal(BackStackRecord.java:595) at android.support.v4.app.BackStackRecord.commit(BackStackRecord.java:574) at com.takeit2eleven.towniemeeting.android.fragments.GoogleMapFragment.onCreateView(GoogleMapFragment.java:42) at android.support.v4.app.Fragment.performCreateView(Fragment.java:1460) at android.support.v4.app.FragmentManagerImpl.moveToState(FragmentManager.java:911) at android.support.v4.app.FragmentManagerImpl.moveToState(FragmentManager.java:1088) at android.support.v4.app.BackStackRecord.run(BackStackRecord.java:682) at android.support.v4.app.FragmentManagerImpl.execPendingActions(FragmentManager.java:1444) at android.support.v4.app.FragmentManagerImpl$1.run(FragmentManager.java:429) at android.os.Handler.handleCallback(Handler.java:615) at android.os.Handler.dispatchMessage(Handler.java:92) at android.os.Looper.loop(Looper.java:137) at android.app.ActivityThread.main(ActivityThread.java:4745) at java.lang.reflect.Method.invokeNative(Native Method) at java.lang.reflect.Method.invoke(Method.java:511) at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:786) at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:553) at dalvik.system.NativeStart.main(Native Method)

Aquí está mi archivo MapsFragment.java:

public class MapsFragment extends SherlockFragment { Button mHotelMapButton; Button mExhibitorButton; GoogleMapFragment mGoogleMapFragment; ScaleImageViewFragment mScaleImageViewFragment; static boolean mShowingGoogleMap = true; @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); if (savedInstanceState != null) { mShowingGoogleMap = savedInstanceState.getBoolean("showingGoogleMap"); } mGoogleMapFragment = new GoogleMapFragment(); mScaleImageViewFragment = new ScaleImageViewFragment(); } @Override public void onSaveInstanceState(Bundle outState) { super.onSaveInstanceState(outState); outState.putBoolean("showingGoogleMap", mShowingGoogleMap); } @Override public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { View view = inflater.inflate(R.layout.maps_fragment, null); mHotelMapButton = (Button) view.findViewById(R.id.hotel_button); mExhibitorButton = (Button) view.findViewById(R.id.exhititor_map_button); mExhibitorButton.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { mShowingGoogleMap = false; showExhibitorFragment(); } }); mHotelMapButton.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { mShowingGoogleMap = true; showGoogleMapFragment(); } }); return view; } @Override public void onPause() { super.onPause(); getChildFragmentManager().beginTransaction() .remove(mGoogleMapFragment) .remove(mScaleImageViewFragment).commit(); } @Override public void onResume() { super.onResume(); if(mShowingGoogleMap){ showGoogleMapFragment(); }else{ showExhibitorFragment(); } } private void showExhibitorFragment(){ getChildFragmentManager().beginTransaction() .remove(mGoogleMapFragment) .remove(mScaleImageViewFragment) .replace(R.id.fragment_placeholder, mScaleImageViewFragment, "scaleImage") .commit(); } private void showGoogleMapFragment(){ getChildFragmentManager().beginTransaction() .remove(mGoogleMapFragment) .remove(mScaleImageViewFragment) .replace(R.id.fragment_placeholder, mGoogleMapFragment, "mapFragment") .commit(); } }

y mi archivo GoogleMapFragment.java:

public class GoogleMapFragment extends Fragment { private SupportMapFragment mMapFragment; private GoogleMap mMap; private final LatLng PLANET_HOLLYWOOD = new LatLng(36.1100, -115.1710); @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); GoogleMapOptions mapOptions = new GoogleMapOptions(); mapOptions.compassEnabled(true).camera(new CameraPosition(PLANET_HOLLYWOOD, 13, 0f, 0f)); mMapFragment = SupportMapFragment.newInstance(mapOptions); } @Override public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { super.onCreate(savedInstanceState); View view = inflater.inflate(R.layout.google_map, container, false); getChildFragmentManager() .beginTransaction() .add(R.id.map_holder, mMapFragment) .commit(); return view; } @Override public void onPause() { super.onPause(); getChildFragmentManager().beginTransaction() .remove(mMapFragment) .commit(); } @Override public void onResume() { super.onResume(); mMap = mMapFragment.getMap(); if(mMap != null){ mMap.addMarker(new MarkerOptions().position(PLANET_HOLLYWOOD).title("Planet Hollywood")); } } }

He estado golpeando mi cabeza contra la pared durante bastante tiempo tratando de descubrir este error y cómo evitarlo / corregirlo.

Actualizar:

por cierto si cambio a:

getActivity().getSupportFragmentManager() .beginTransaction() .add(R.id.map_holder, mMapFragment) .commit();

en GoogleMapFragment, entonces no obtengo el error, pero no puedo obtener el mapa para establecer el creador ... parece una condición de carrera


Puede solucionar esto, si elimina todos los fragmentos anidados en onDestroyView() :

public void onDestroyView() { super.onDestroyView(); Fragment fragment = (getFragmentManager().findFragmentById(R.id.map)); FragmentTransaction ft = getActivity().getSupportFragmentManager().beginTransaction(); ft.remove(fragment); ft.commit(); }

E onCreateView() como de costumbre en onCreateView() :

public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { return inflater.inflate(R.layout.map, container, false); }