2016-08-23 2 views
0

私のアクティビティに2つの断片があります。フラグメントを切り替えるときは、次のコードを使用します。FragmentTransaction複数のタスクをコミットすることができません

private void switchCourseFragment() { 
    if (mCourseFragment == null || getActivity().isFinishing()) return; 
    FragmentTransaction mTransaction = mFragmentManager.beginTransaction(); 
    if (mFragmentLogin != null && mFragmentLogin.isAdded()) { 
     mTransaction.remove(mFragmentLogin); 
    } 
    if (!mCourseFragment.isAdded()) { 
     mTransaction.add(R.id.learncenter_contain, mCourseFragment).commitAllowingStateLoss(); 
    } 
} 

これは私が期待したものではありません。 mFragmentLoginは削除されていませんが、mCourseFragmentが追加されています。

+0

削除トランザクションをコミットしていません –

答えて

0

これを有効にする必要があります。

private void switchCourseFragment() { 
    if (mCourseFragment == null || getActivity().isFinishing()) return; 
    if (mFragmentLogin != null && mFragmentLogin.isAdded()) { 
     mFragmentManager.beginTransaction().remove(mFragmentLogin).commit(); 
    } 
    if (!mCourseFragment.isAdded()) { 
     mFragmentManager.beginTransaction().add(R.id.learncenter_contain, mCourseFragment).commitAllowingStateLoss(); 
    } 
} 

代わりにreplaceを使用してください。

private void switchCourseFragment() { 
    if (mCourseFragment == null || getActivity().isFinishing()) return; 
    if (!mCourseFragment.isAdded()) { 
     mFragmentManager.beginTransaction().replace(R.id.learncenter_contain, mCourseFragment).commitAllowingStateLoss(); 
    } 
} 

これは、両方のフラグメントが同じコンテナにあると仮定します。

+0

ありがとうございました!私の理解は、FragmentTransactionは複数のタスクを実行でき、最後にすべてのタスクをコミットすることです。私は間違っていたかもしれません! – user6703435

+0

@ user6703435 It * CAN *は複数のタスクを実行できますが、流暢なインターフェイスです。したがって、 'mTransaction.remove()'の戻り値を使用する必要があります。例えば、 'mTransaction = mTransaction.remove(mFragmentLogin);'とします。 – Joshua

関連する問題