2016-04-10 28 views
2

以下のメソッドに置き換えられるフラグメントがあります。私はバックスタックに複数のフラグメントを追加するのを防ぐため、私のコードには何か問題があると思います。フラグメントBを2回クリックすると、すべてのインスタンスがバックスタックに追加され、戻るボタンを押すと、2つの作成されたインスタンスが渡されます。Androidフラグメント - 既に存在する場合は、バックスタックからフラグメントを削除します。

public void replaceFragment(Fragment fragment, boolean addToBackStack, boolean customAnimation) { 
    FragmentManager manager = getSupportFragmentManager(); 
    FragmentTransaction transaction = manager.beginTransaction(); 
    String tag = fragment.getClass().getSimpleName(); 
    if (customAnimation) { 
     transaction.setCustomAnimations(R.anim.slide_in_bottom, R.anim.slide_out_bottom, R.anim.slide_in_bottom, R.anim.slide_out_bottom); 
    } 
    transaction.replace(R.id.fragment_container, fragment, tag); 

    // remove from back stack if exists 
    // always return false! 
    boolean f = manager.popBackStackImmediate(tag, 0); 

    if (addToBackStack) { 
     transaction.addToBackStack(tag); 
    } 
    transaction.commit(); 
} 

答えて

4

必要に応じて簡単にバックスタックに追加できます。 追加するフラグメントが現在のフラグメントと同じクラスの場合、バックスタックに追加しないでください。

public void replaceFragment(Fragment frag) { 
    FragmentManager manager = getSupportFragmentManager(); 
    if (manager != null){ 
     FragmentTransaction t = manager.beginTransaction(); 
     Fragment currentFrag = manager.findFragmentById(R.id.content_frame); 

     //Check if the new Fragment is the same 
     //If it is, don't add to the back stack 
     if (currentFrag != null && currentFrag.getClass().equals(frag.getClass())) { 
      t.replace(R.id.content_frame, frag).commit(); 
     } else { 
      t.replace(R.id.content_frame, frag).addToBackStack(null).commit(); 
     } 
    } 
} 
+1

これは私が本当に必要なものです。ダニエルありがとう。質問があります。バックスタック名として 'null'を渡した理由は?フラグメントタグを渡すとどうなるでしょうか? – Alireza

関連する問題