2012-04-03 23 views
8

私は、左側のメニュー項目のリスト(フラグメントM)と右側の現在選択されている項目の詳細(フラグメントD)の2つのペインでアクティビティを持っています。Android onConfigurationChanged:フラグメントバックスタックを保存して復元する方法は?

ユーザがフラグメントDでアイテムを選択すると、フラグメントDが別のフラグメントに置き換えられます(D1とします)。ユーザがフラグメントD1内のアイテムを選択すると、フラグメントD1は別のフラグメント(D2と呼ぶ)に置き換えられ、以下同様に続きます。 もちろん、ユーザーが戻るボタンを押すと、フラグメント履歴:D2-> D1-> Dに戻ることができます。

私の問題は、構成を変更したとき(特に画面の向きに合わせて)、完全なフラグメントバックスタックを保存して復元するにはどうすればいいですか?

これまで誰もこの問題を抱えていなかったのは私にとっては奇妙なことですが、GoogleとStack Overflowでの検索ではこれについて何も見つかりませんでした。私が関連する投稿を見逃した場合、私にそれに対処してください。

アクティビティの再作成を避けるために、android:configChanges="orientation|screenSize"属性を自分のアクティビティに単に追加することができますが、それはできません。

私がそれを行うことができないのは、私が後方互換性のためにAction Bar Sherlock(バージョン4)を使用していて、コンポーネントがAFAIK設定変更時に正しく動作するためにアクティビティの再作成が必要なことです。

アクティビティを破棄して再作成せずにアクションバーシャーロックコンポーネントを再作成する別の方法がある場合は、お知らせください。

ありがとうございます。

答えて

0

アクションバーシャーロック(ABS)は、ABS 3.xのアクティビティを再現するためにアクションバーを再作成する必要がありましたが、@Jake Wharton's commentによれば、バージョン4ではレクレーションが必要ありません。ですから、android:configChanges = "orientation"を設定すると、フラグメントのバックスタックが維持されます。

+1

@ Iarham1あなたのお返事ありがとうございます。残念ながら、ABS4は、android:configChanges = "orientation"が[issue#279]で説明されているようにいくつかのOSバージョン(例:2.3.7)でいくつかの問題がありますhttps://github.com/JakeWharton/ActionBarSherlock/issues/279#issuecomment-4934511)、これは現時点で実行可能な解決策ではありません。 Jake Whartonが近い将来に修正されることを願っていますが、その間に、あなたや他の誰かが、コンフィギュレーションの変更時に完全なフラグメントバックスタックを保存して復元する方法を知っていますか?あるいは、ABSコードを微調整してコンフィグレーション変更時にABSのみをプログラムで再作成する方法はありますか? – Luke

5

Fragmentsを私自身のArrayListに追加してキャッシュすることで、これを行うことができました。次に、OnBackStackChangedListenerを設定して、表示されたものを追跡し、必要に応じてArrayListをポップします。

私の目的は少し異なりましたが、以下のコードはあなたの説明に必要なものでなければなりません。タグは、必要に応じて複数のバックスタックを持つことができるようになっています。現状のままではコンパイルされません(私は自分のコードをたくさん切り詰めました)が、どうやってそれをやったのか分かります。追加の免責事項:私はちょうどがこれを働かせ、私がまだヒットしなかった問題があるかもしれません。

public void replaceFragmentWithBackStackForTag(Fragment fragment, String tag) 
    { 
     FragmentTransaction ft = getSupportFragmentManager().beginTransaction(); 
     ft.detach(visibleFragment); 
     ft.add(R.id.realtabcontent, fragment, tag); 
     ft.attach(fragment); 
     ft.addToBackStack(null); 
     manualBackStacks.get(tag).add(fragment); 
     ft.commit(); 
     this.getSupportFragmentManager().executePendingTransactions(); 
    } 

あなたの活動は、姿勢変更後に再作成されますどこがよいでしょうコード:

ArrayList<Fragment> backStack = 
     new ArrayList<Fragment>(manualBackStacks.get(tag)); 
popArrayListToIndex(manualBackStacks.get(tag), 0); // helper I wrote 
for (int bs = 1; bs < backStack.size(); bs++) { 
    replaceFragmentWithBackStackForTag(backStack.get(bs), tag); 
} 

backstackリスナー:

public void onBackStackChanged() { 
    int index = getSupportFragmentManager().getBackStackEntryCount(); 
    ArrayList<Fragment> backStack = manualBackStacks.get(tag); 
    visibleFragment = backStack.get(index); 
    // Pop the last element if we've backed up. 
    popArrayListToIndex(backStack, index); 
} 

・ホープ、このことができますし。

+0

私はこのアプローチに非常に関心がありますが、あなたの答えが私には分かりやすい詳細を与えてくれるとは思われません。あなたの答えに詳細を追加できますか? – deepwinter

+0

これは、ありがとう! – deepwinter

関連する問題