我有一个使用 Fragment
的选项卡式应用程序s,还有一个小问题。
MainActivity
(扩展 FragmentActivity
- 没有为 onCreate
上的布局规范保存代码)包括 Fragment
称为 TabsFragment
(扩展 Fragment
,实现 OnTabChangeListener
)在其布局中(将选项卡本身包含在 FrameLayout
中),切换出子 Fragment
使用Transaction
后者子Fragments
当用户转动设备、访问另一个应用程序、接听电话或做其他事情时,我希望保存其状态的实际内容。目前子状态Fragment
s 没有保存,但 Activity 会记住哪个子- Fragment
正在显示。 (因此,如果我让设备处于横向模式并在选项卡 3 处于 Activity 状态时转动设备,选项卡 3 将以纵向模式出现,重置,但显示。因此在我没有做任何事情的情况下保留了一些状态)。
因为我有多种布局(横向和纵向),android:configChanges="orientation"
在 list 中不是一个选项 - 我无论如何都不想使用它,因为它是一个美化的创可贴。
我正在使用 v4 支持库(修订版 10),在搜索 API 后,我遇到了 FragmentManager.saveFragmentInstanceState()
和 Fragment.setInitialSavedState(Fragment f)
.我已经为每个子 Fragment
放置了 saveFragmentInstanceState()在覆盖onPause()
TabsFragment
的方法| .我不确定这是否有效,因为无论我把 setInitialSavedState
放在哪里, 它给出了一个 IllegalStateException
- 但即使我刚刚初始化一个新的子 - Fragment
也会发生这种情况标签。当我将它放入 onResume
时它也会崩溃在 TabsFragment
.
代码 fragment :
//... 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
,我收到以下错误:
错误 fragment :
FATAL EXCEPTION: main
java.lang.RuntimeException: Unable to resume activity (org.example.App/org.example.App/MainActivity): java.lang.IllegalStateException: Fragment already active
<p>-snip-</p>
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() 是否确实是这里使用的最佳选择,因为选项卡式设置的性质有些复杂。如果是这样,使用什么?如何保存应用程序选项卡的状态?
最佳答案
当一个 Activity 被销毁时,Fragments 会从 Activity 中分离出来,并在它被重新创建时重新附加。因此, fragment 应该仍以当前状态存在。重新附加时,将再次调用 OnCreateView
。如果您像从头开始一样初始化所有内容(即将列表设置为 new ArrayList()
),您将清除 fragment 的状态。
尝试在您的 Fragment 中为所有需要保留的内容创建一个实例变量(即,任何文本字段的字符串 - EditText 字段将如您所述自动保存)。示例:
String text; TextView tv; public View onCreateView(LayoutInflater i, ViewGroup vg, Bundle b) { // this will re-inflate everything from the layout. If you initialize any text fields here, it will reset them to the value you set in the xml file View v = i.inflate(R.layout.myLayout, vg, false); if(text != null) tv.setText(text); }
当您的 TextView 值发生变化时(比如在 OnClickListener 或类似物中),设置 text
的值以及您对它所做的任何其他操作。重新附加 fragment 时,它会将其设置为上次所做的更改。
关于安卓:设置初始保存状态,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14040203/