2016-11-03 106 views
1

我有一个mapview的片段。我可以从操作栏中打开另一个片段(称为listfragment),它工作正常。但是如果我旋转屏幕,然后尝试打开listfragment,它不会加载,而是mapview按时闪烁(视图中的地图变为空白,然后再次出现)。如果我尝试通过点击操作栏上的菜单项再次加载listfragment,与MapView搞砸了我的片段交易?

java.lang.IllegalStateException应用程序崩溃:片段已经补充说:

MainActivity的部分加载的片段:NewTrackFragment与MapView的

@Override 
    protected void onCreate(final Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     setContentView(R.layout.activity_main); 
     Toolbar toolbar = (Toolbar) findViewById(R.id.toolbar); 
     setSupportActionBar(toolbar); 

     mNewTrackFragment = (NewTrackFragment) getFragmentManager() 
       .findFragmentByTag(TAG_NEW_TRACK_FRAGMENT); 
     if (mNewTrackFragment == null) { 
      mNewTrackFragment = NewTrackFragment.newInstance(); 
     } 
     FragmentManager fragmentManager = getFragmentManager(); 
     fragmentManager.beginTransaction() 
       .add(R.id.fragment_container, mNewTrackFragment) 
       .commit(); 
    } 

    @Override 
    public boolean onOptionsItemSelected(MenuItem item) { 
     int id = item.getItemId(); 

     if (id == R.id.action_track_list) { 
      if (null == mTrackListFragment) { 
       mTrackListFragment = TrackListFragment.newInstance(); 
      } 
      FragmentManager fragmentManager = getFragmentManager(); 
      fragmentManager.beginTransaction() 
        .replace(R.id.fragment_container, mTrackListFragment, TAG_TRACK_LIST_FRAGMENT) 
        .addToBackStack(null) 
        .commit(); 

      return true; 
     } 

部分:

public NewTrackFragment() { 
} 

public static NewTrackFragment newInstance() { 
    NewTrackFragment fragment = new NewTrackFragment(); 
    return fragment; 
} 

@Override 
public void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    setRetainInstance(true); 
} 

@Override 
public View onCreateView(LayoutInflater inflater, ViewGroup container, 
         Bundle savedInstanceState) { 
    View view = inflater.inflate(R.layout.fragment_new_track, container, false); 

    mTrackTitleTV = (TextView) view.findViewById(R.id.tv_track_title); 
    mDistanceTV = (TextView) view.findViewById(R.id.tv_distance); 
    mElapsedTimeTV = (TextView) view.findViewById(R.id.tv_elapsed_time); 
    mSpeedTV = (TextView) view.findViewById(R.id.tv_speed); 
    mAscentTV = (TextView) view.findViewById(R.id.tv_ascent); 
    mDescentTV = (TextView) view.findViewById(R.id.tv_descent); 
    mAltitudeTV = (TextView) view.findViewById(R.id.tv_altitude); 
    mStartStopFab = (FloatingActionButton) view.findViewById(R.id.fab_startstop); 
    mMapView = (MapView) view.findViewById(R.id.new_track_mapview); 

    setupMapView(savedInstanceState); 

    return view; 
} 

private void setupMapView(Bundle savedInstanceState) { 
    mMapView.onCreate(savedInstanceState); 
    mMapView.getMapAsync(this); 
} 

我搜索了一些关于它的信息,但没有发现类似的东西。

回答

0

这里有一些错误。现在,您在onCreate之内没有通过TAG_NEW_TRACK_FRAGMENT作为标记拨打add。因此,您将添加一个不带关联标记的NewTrackFragment实例,因此对findFragmentByTag的调用将始终返回null。实际上,每次旋转设备时都会创建一个新的NewTrackFragment实例。这并不好,因为FragmentManager的状态在整个设备旋转过程中保持不变,这意味着它仍然持有您添加到其中的每个Fragment。由于您无条件地致电addFragmentManager将最终持有NewTrackFragment的多个实例。

虽这么说,你应该做的是在通话中添加标签add和来电add一旦你知道了FragmentManager目前未持有至NewTrackFragment一个实例:

mNewTrackFragment = (NewTrackFragment) getFragmentManager() 
       .findFragmentByTag(TAG_NEW_TRACK_FRAGMENT); 
     if (mNewTrackFragment == null) { 
      mNewTrackFragment = NewTrackFragment.newInstance(); 
      FragmentManager fragmentManager = getFragmentManager(); 
      fragmentManager.beginTransaction() 
        .add(R.id.fragment_container, mNewTrackFragment, TAG_NEW_TRACK_FRAGMENT) 
        .commit(); 
     } 

你可能想和你的TrackListFragment做类似的事情:

if (id == R.id.action_track_list) { 
      FragmentManager fragmentManager = getFragmentManager(); 
      mTrackListFragment = (TrackListFragment) fragmentManager.findFragmentByTag(TAG_TRACK_LIST_FRAGMENT); 
      if (null == mTrackListFragment) { 
       mTrackListFragment = TrackListFragment.newInstance(); 
       fragmentManager.beginTransaction() 
         .replace(R.id.fragment_container, mTrackListFragment, TAG_TRACK_LIST_FRAGMENT) 
         .addToBackStack(null) 
         .commit(); 
      } 
} 
+1

谢谢你的回答,它解决了我的问题。由于其他错误,我早先搞乱了我的分段事务。实施你的解决方案再次设置它:) – vokod