9

私はマップのアクティビティ(SherlockFragmentActivity)を持っている2つの異なる断片を示すとの2つのボタンやスイッチを持っているマップの断片の荷重(GoogleMapFragment & ScaleImageViewFragment)スイッチング断片 - Googleマップ断片V2 - 活動が破棄されたエラー

Screen Shot

私はそれがフラグメントを置き換える出展地図]ボタンをクリックすると、私は戻ってクリックすると、しかし、私は「java.lang.IllegalStateExceptionを:アクティビティが破壊された」取得エラー

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) 

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

と私のGoogleMapFragment.javaファイル:

はここに私のMapsFragment.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")); 
    } 
} 
} 

それを避ける/修正する方法。

更新:

方法によって私はに切り替える場合:GoogleMapFragmentに

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

、私はエラーを取得いけないが、私はメーカーを設定するためのマップを手に入れるカント.. 。それは競合状態のように思える

答えて

13

あなたがonDestroyView()内のすべてのネストされた断片を削除する場合は、この問題を解決することができます

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

そしてonCreateView()にいつものようにそれらを膨らま:

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

だけで優れました! API 16を使用したい人はNestedFragmentsを使うことができないので、このソリューションは私の場合にはうまくいきます! – Otuyh