gpt4 book ai didi

android - backstack事务后如何持久化 fragment 数据?

转载 作者:塔克拉玛干 更新时间:2023-11-02 08:31:51 29 4
gpt4 key购买 nike

我有一个 Activity ,其中包含 fragment “列表”,单击其中一项后,它会将自身替换为“内容” fragment 。当用户使用后退按钮时,他会再次进入“列表” fragment 。
问题是 fragment 处于默认状态,无论我如何尝试保留数据。

事实:

  1. 这两个 fragment 都是通过 public static TheFragment newInstance(Bundle args)setArguments(args)Bundle args = getArguments() 创建的/li>
  2. 两个 fragment 都在同一层,直接位于父 Activity 的 FrameLayout 内(即,不是嵌套的 fragment )
  3. 我不想调用 setRetainInstance,因为我的 Activity 是主/详细流程,在较大的屏幕上有 2 个 Pane 布局。 7 英寸平板电脑有 1 个纵向 Pane 和 2 个横向 Pane 。如果我保留“列表” fragment 实例,它(我认为)会因屏幕旋转而搞砸
  4. 当用户点击 'list' fragment 中的项目时,'content' fragment 通过 FragmentTransaction#replace(int, Fragment, String) 显示,ID 相同但标签不同
  5. 我确实重写了 onSaveInstanceState(Bundle),但这并不总是由框架调用,如per the doc : “在很多情况下,一个 fragment 可能大部分被拆除(例如当放置在没有 UI 显示的返回堆栈上时),但它的状态不会被保存,直到它拥有的 Activity 实际需要保存它的状态。 "
  6. 我正在使用支持库

从上面的第5点,我猜想低端设备在 fragment 事务后需要回收内存可能会调用Fragment#onSaveInstanceState(Bundle)。但是,在我的测试设备(Galaxy Nexus 和 Nexus 7)上,框架不会调用该方法。所以这不是一个有效的选项。

那么,如何保留一些 fragment 数据呢?传递给 Fragment#onCreateFragment#onActivityCreated 等的包始终为 null

因此,我无法区分从全新 fragment 启动到返回堆栈恢复。

注意:可能related/duplicate question

最佳答案

这似乎不对,但我最终是这样做的:

public class MyActivity extends FragmentActivity {
private Bundle mMainFragmentArgs;

public void saveMainFragmentState(Bundle args) {
mMainFragmentArgs = args;
}

public Bundle getSavedMainFragmentState() {
return mMainFragmentArgs;
}

// ...
}

在主要 fragment 中:

public class MainFragment extends Fragment {
@Override
public void onActivityCreated(final Bundle savedInstanceState) {
super.onCreate(savedInstanceState);

Bundle args = ((MyActivity) getActivity()).getSavedMainFragmentState();

if (args != null) {
// Restore from backstack
} else if (savedInstanceState != null) {
// Restore from saved instance state
} else {
// Create from fragment arguments
args = getArguments();
}

// ...
}

// ...

@Override
public void onDestroyView() {
super.onDestroyView();
Bundle args = new Bundle();
saveInstance(args);
((MyActivity) getActivity()).saveMainFragmentState(args);
}

@Override
public void onSaveInstanceState(Bundle outState) {
super.onSaveInstanceState(outState);
saveInstance(outState);
}

private void saveInstance(Bundle data) {
// put data into bundle
}
}

有效!

  • 如果从后台返回, fragment 使用保存在onDestroyView中的参数
  • 如果从另一个应用程序/进程返回/内存不足, fragment 将从 onSaveInstanceState
  • 恢复
  • 如果是第一次创建, fragment 使用setArguments中设置的参数

事件全覆盖,时刻保持最新资讯。

其实更复杂,它是基于interface的,监听器是从onAttach/onDetach中取消/注册的。但原理是一样的。

关于android - backstack事务后如何持久化 fragment 数据?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17252236/

29 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com