9

Ben Haritalar Etkinlik (SherlockFragmentActivity) sahip olduğu 2 farklı parçalarını gösteren arası 2 düğme ve anahtarlara sahip bir Maps Fragment yükler (GoogleMapFragment & ScaleImageViewFragment)Switching fragmanları - Google Harita Parçası V2 - Etkinlik yok edildi Hata

hatayı

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) 
: "Etkinlik yok edildi java.lang.IllegalStateException" Ben parçasını değiştirir Katılımcı Harita düğmesini tıkladığınızda geri tıkladığınızda Screen Shot

, ancak ben bir olsun

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

ve benim GoogleMapFragment.java dosyası::

İşte benim MapsFragment.java dosyasıdır bu hatayı anlamaya çalışırken oldukça zaman kafamı duvara vurarak edilmiştir

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

ve nasıl önlenir/düzeltilir.

Güncelleme: bu arada

Ben geçerseniz: GoogleMapFragment içinde

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

sonra hata alamadım ama makinesi ayarlamak için harita bir tutmak olamaz .. . bu bir yarış durumu gibi görünüyor

cevap

13

Eğer onDestroyView() tüm yuvalanmış parçaları silerseniz, bu düzeltebilirsiniz:

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

Ve onCreateView() her zamanki gibi onları şişirme:

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

Sadece mükemmel! API 16'yı kullanmak isteyenler NestedFragments'ı kullanamazlar, bu yüzden bu çözüm benim durumumda iyi sonuç verir! – Otuyh

İlgili konular