安卓:设置初始保存状态

标签 android android-fragments

我有一个使用 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/

相关文章:

android - onActivityResult 不调用并且 Fragment 从图像选择器 Android 中自行关闭

android - 删除 fragment 问题

android - 当 getView() 为空时,即在 onCreateView() 之前或 onDestroyView() 之后,无法访问 fragment View 的 LifecycleOwner

java - ActionBar 后退按钮从内部 Fragment 完成 Activity

android - (ART/DVM) 在 :try_end instruction results in VerifyError 之前插入指令

php - 无法将大于 500kb 的视频文件大小上传到 Android 中的 Linux 服务器

Android TabLayout 选中的tab背景

Android:图像按钮图标和文本

android - 如何在 Android 的 WebView 中调整图像

java - 如何使用 json 文件显示自动完成字段的建议?