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);
}