sを使用したタブ付きアプリケーションFragment
と、わずかな問題があります。
MainActivity
(extends FragmentActivity
- with no code save for the layout specification on onCreate
) は、Fragment
呼び出されたTabsFragment
(extends Fragment
, implements OnTabChangeListener
) をそのレイアウト (タブ自体を a に格納) に含め、 s を使用FrameLayout
してサブを切り替えます。Fragment
Transaction
後者のサブFragments
は、ユーザーがデバイスの電源を入れたとき、別のアプリケーションにアクセスしたとき、電話に応答したとき、または何か他のことをしたときに状態を保存したい実際のコンテンツを含むものです。現在、サブFragment
の状態は保存されていませんが、アクティビティはどのサブFragment
が表示されているかを記憶しています。(したがって、デバイスを横向きモードにして、タブ 3 がアクティブなときにデバイスを回転させると、タブ 3 が縦向きモードで表示され、リセットされますが、表示されます。そのため、何もしなくても状態が保持されます)。
私は複数のレイアウト (横向きと縦向き) を持っているのでandroid:configChanges="orientation"
、マニフェストではオプションではありません。
私は v4 サポート ライブラリ (rev 10) を使用しており、API を精査した後FragmentManager.saveFragmentInstanceState()
、Fragment.setInitialSavedState(Fragment f)
. Fragment
のオーバーライドされたonPause()
メソッドの各サブに saveFragmentInstanceState() を配置しましたTabsFragment
。をどこに置いても - が表示setInitialSavedState
されるため、これが機能するかどうかはわかりませんIllegalStateException
が、これは新しいサブタブを初期化したばかりの場合でも発生しFragment
ます。に入れるとクラッシュonResume
しTabsFragment
ます。
コードスニペット:
//... this is the 'showTab' method
if(getFragmentManager().findFragmentByTag(id) == null)
{
Fragment f = null;
if(BASIC_TAB.equals(id))
{
f = new BasicTabFragment();
f.setInitialSavedState(basicState); // basicState was set in onPause()
getFragmentManager().beginTransaction().replace(tabNo, f, tabID).commit();
}
}
に同様のコードを配置するとonResume
、次のエラーが発生します。
エラー スニペット:
FATAL EXCEPTION: main
java.lang.RuntimeException: Unable to resume activity (org.example.App/org.example.App/MainActivity): java.lang.IllegalStateException: Fragment already active
-snip-
Caused by: java.lang.IllegalStateException: Fragment already active at android.support.v4.app.Fragment.setIniailSavedState(Fragment.java:507)
at org.example.App.TabsFragment.onResume(TabsFragment.java:223)
等
ライフサイクルの間違った時点で setInitialSavedState を呼び出していることは明らかですが、これがいつ発生するかは明確ではありません。
また、タブ付きセットアップのやや複雑な性質を考えると、FragmentManager.saveFragmentInstanceState() が実際にここで使用するのに最適なものであるかどうか疑問に思い始めています。もしそうなら、何を使うべきですか?アプリケーションのタブの状態を保存するにはどうすればよいですか?