我有一个使用Fragment
s 的选项卡式应用程序,还有一个小问题。
MainActivity
(extends FragmentActivity
- 除了布局规范之外没有代码) 在其布局中onCreate
包含一个Fragment
被调用的TabsFragment
(extends Fragment
, implements OnTabChangeListener
) (将选项卡本身包含在 a 中),使用sFrameLayout
切换 sub - s。Fragment
Transaction
后一个子Fragments
是具有实际内容的子,当用户转动设备、访问另一个应用程序、接听电话或做其他事情时,我希望保存其状态。目前,sub- Fragment
s 的状态没有被保存,但活动会记住Fragment
正在显示的 sub-s。(因此,如果我将设备置于横向模式并在选项卡 3 处于活动状态时转动设备,则选项卡 3 将以纵向模式出现,重置,但显示。因此在我没有做任何事情的情况下保留了某些状态)。
因为我有多种布局(横向和纵向),android:configChanges="orientation"
所以在清单中不是一个选项 - 我不想使用它,因为它是一个美化的创可贴。
我正在使用 v4 支持库(第 10 版),在搜索 API 之后,我遇到FragmentManager.saveFragmentInstanceState()
了Fragment.setInitialSavedState(Fragment f)
. 我已将每个 sub- 的 saveFragmentInstanceState( Fragment
)onPause()
放在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() 是否确实是在这里使用的最佳选择。如果是这样,用什么?如何保存应用程序选项卡的状态?