2016-11-03 80 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