9

我有一个地图活动(SherlockFragmentActivity),该负载在具有示出2个不同的片段之间2个按钮和开关的地图片段(GoogleMapFragment & ScaleImageViewFragment)开关片段 - 谷歌地图片段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) 

这里是我的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(); 
} 
} 

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

我一直在敲打我的头靠在墙上相当长的一段时间,试图找出这个错误以及如何避免/修复它。

更新:

顺便说一下,如果我切换到:在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 2013-05-09 18:46:24