2013-08-17 10 views
6

現在、私は1つのアクティビティを持っており、その中にフラグメント(検索、曲の詳細、設定など)が追加されています。サイドベースのメニューナビゲーションを実装しました。そのため、副作用として、バックスタックに追加されるフラグメントの数に制限はありません。 フラグメントの数を制限したり、古いエントリを削除する方法はありますか?たとえば、それぞれの曲の詳細の断片には、お勧めの曲のリストがあり、それを通して別の曲の詳細の断片に行くことができます。バックスラックには30個の断片があります。DDMSを開いていると、ヒープサイズがゆっくりと(しかし確実に)増加することがわかります。Android - バックスタックのフラグメント数を制限しますか?

編集:私がしようとしたことの1つは、サイドメニューオプションの1つをクリックした場合、そのフラグメントが既にバックスタックにある場合、新しいフラグメントをインスタンス化する代わりにそのフラグメントに戻ることですユーザーが「ソングの詳細」ページにいる場合は、「戻る」を押すとその部分に移動し、機能しなくなることが期待されます。

編集2: これは(フィルの提案と一緒に)私のaddFragment方法である:

public void addFragment(Fragment fragment) { 

     FragmentManager fm = getSupportFragmentManager(); 
     if(fm.getBackStackEntryCount() > 2) { 

       fm.popBackStack(); 
      } 
     fm.beginTransaction()     
        .replace(R.id.fragment_container, fragment).addToBackStack("") 
        .commit(); 
} 

私はちょうどそれを試してみました、そして私のフラグメント履歴を仮定することである:A-> B-> C-> D、 Dから戻ると、B→A→出口に進みます。

A-> B-> C-> D-> E-> F-> G-> Hとなり、同じことが起こった:H→B →A→出口。

すべてのフラグメントが上記の方法で追加されています。私が見たいのは、H-> G-> F->出口です。

答えて

10

あなたはプログラム的にあなたのBackStackにフラグメントの数を制御することができます

FragmentManager fm = getActivity().getSupportFragmentManager(); 

if(fm.getBackStackEntryCount() > 10) { 

    fm.popBackStack(); // remove one (you can also remove more) 
} 

単にあなたのBackstackにありますどのように多くのフラグメントをチェックし、「オーバーフロー」がある場合は削除します。あなたはBackStackから特定のフラグメントを削除したい場合は

は、あなたがあなた自身のBackStackを実装を持っているとonBackPressedを上書きします()。フラグメントBackStackはスタック(名前が示すように)であるため、先頭の要素(最後に追加されたもの)のみを削除できます。その間にフラグメントを削除する可能性はありません。

あなたは、たとえば、独自のスタックを実現するために

ArrayList<Fragment> 

を使用することができます。 onBackPressed()メソッドをオーバーライドして以前のフラグメントの読み込みを処理したい場合はいつでも、その "スタック"からフラグメントを追加して削除するだけです。

+0

myFragはどこから来ますか?新しいフラグメントを追加しようとしているときにこのコードを実行していると仮定すると、以前のすべてのフラグメントへの参照を既に持っている必要がありますか? – StackOverflowed

+0

これは単なるコード例ですが、myFragは、たとえば、現在アクティブなFragmentである可能性があります。このコードは、if文の中でfm.popBackStack()を呼び出すだけでも動作します。 –

+0

あなたは正しい軌道に乗っているようですが、最も古い断片を削除したいと思います。詳細は編集を参照してください。これまであなたの助けに本当に感謝しています。 – StackOverflowed

3

これは古い質問ですが、私の答えは誰かを助けるかもしれません。

フラグメントがスタックに入っていてポップしているのを確認しないのはなぜですか?この方法では、スタックの大きさを気にする必要はありません(断片が多い場合を除きます)。

String backStateName = fragment.getClass().getName(); 
    boolean fragmentPopped = false; 
    try { 
     // true if fragment is in the stack 
     fragmentPopped = fragmentManager.popBackStackImmediate(backStateName, 0); 
    } catch (Exception e) { 
     e.printStackTrace(); 
    } 

    FragmentTransaction ft = fragmentManager.beginTransaction(); 

    if (!fragmentPopped) { //fragment not in back stack, add it...    
     ft.setTransition(FragmentTransaction.TRANSIT_FRAGMENT_FADE); 
     ft.replace(R.id.main, fragment); 
     ft.addToBackStack(backStateName); 

     try { 
      ft.commit(); 
     } catch (Exception e) { 
      e.printStackTrace(); 
     }   
    } 
関連する問題