2016-11-03 6 views
1

私はマップビューを持つフラグメントを持っています。アクションバーから別のフラグメント(listfragmentと呼ぶ)を開くことができますが、正常に動作します。しかし、画面を回転させてリストフラグメントを開こうとすると、ロードされず、マップビューが時間通りに点滅します(ビュー内のマップが空白になり、再度表示されます)。私は、アクションバーのメニューアイテムをクリックすると、再びMapViewは私のフラグメント取引を乱した?

java.lang.IllegalStateExceptionとアプリのクラッシュをlistfragmentをロードしようとした場合:フラグメントはすでに追加:フラグメントをロードMainActivityの

パートを:のMapViewとNewTrackFragmentの

@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

ここにはいくつか問題があります。今すぐaddへの呼び出しでTAG_NEW_TRACK_FRAGMENTをタグとして渡していないので、onCreateになります。このため、関連付けられたタグなしでNewTrackFragmentインスタンスを追加するため、findFragmentByTagの呼び出しは常にnullを返します。基本的には、デバイスを回転させるたびにNewTrackFragmentという新しいインスタンスを作成しています。 FragmentManagerの状態は、デバイスの回転を超えて保持されているため、これは良くありません。つまり、追加した各Fragmentを保持しているということです。無条件にaddを呼び出しているため、FragmentManagerは複数のインスタンスNewTrackFragmentを保持してしまいます。言ったことで

、何をやるべきことaddへの呼び出しにタグを追加するだけで、あなたがFragmentManagerが現在NewTrackFragmentのインスタンスに保持されていない知っていればaddを呼び出すです:

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

関連する問題