gpt4 book ai didi

android - 如何在选项卡中没有后台堆栈的情况下维护 fragment 状态?

转载 作者:塔克拉玛干 更新时间:2023-11-01 22:10:05 25 4
gpt4 key购买 nike

我试图在 onSaveInstanceState 中保存 fragment 状态,但是当我返回 fragment 时,它总是重新加载而不是从上一个状态开始。

我查看了 onCreateViewonActivityCreated,它始终将 onSaveInstanceState 设为 null。

public void navigateFragment(String tag, Fragment fragment,
boolean shouldAdd) {

FragmentManager manager = getSupportFragmentManager();
FragmentTransaction ft = manager.beginTransaction();


if (shouldAdd)
mStacks.get(tag).push(fragment); // push fragment on stack

ft.replace(android.R.id.tabcontent, fragment);

if (shouldAdd)
ft.addToBackStack(tag);

ft.commit();

}

因为我无法使用 backstack 因为在选项卡中 back stack 没有用。任何帮助将不胜感激。

最佳答案

在这种情况下,您必须自己管理 fragment 的状态。我不知道你的代码是如何工作的,所以我唯一能做的就是给你一些提示。

您需要执行的第一件事是保存 fragment 的状态。假设所有 fragment 都有唯一的 ID。在这种情况下,您需要创建一个将保留所有状态的 map :

private final Map<String, Fragment.SavedState> mFragmentStates = new HashMap<>();

private void saveFragmentState(String id, Fragment fragment) {
Fragment.SavedState fragmentState =
getSupportFragmentManager().saveFragmentInstanceState(fragment);
mFragmentStates.put(id, fragmentState);
}

您需要为要删除的 fragment 调用此方法。然后我们需要恢复 fragment 的状态,这就是我们可以做到的:

private void restoreFragmentState(String id, Fragment fragment) {
Fragment.SavedState fragmentState = mFragmentStates.remove(id);
if (fragmentState != null) {
fragment.setInitialSavedState(savedState);
}
}

您需要在将 fragment 添加到事务之前调用此方法。

提供的代码应该可以正常工作,但要使其在 Activity 重新创建时正常工作,我们需要正确保存和恢复 mFragmentStates:

private static final String KEY_FRAGMENT_STATES = "fragment_states";

@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
/* Your code ... */

if (savedInstanceState != null) {
Bundle fragmentStates =
savedInstanceState.getParcelable(KEY_FRAGMENT_STATES);
if (fragmentStates != null) {
for (String id : fragmentStates.keySet()) {
Fragment.SavedState fragmentState =
fragmentStates.getParcelable(id);
mFragmentStates.put(id, fragmentState);
}
}
}
}

@Override
protected void onSaveInstanceState(Bundle outState) {
super.onSaveInstanceState(outState);
/* Your code ... */

Bundle fragmentStates = new Bundle(mFragmentStates.size());
for (Map.Entry<String, Fragment.SavedState> entry : mFragmentStates.entrySet()) {
fragmentStates.put(entry.getKey(), entry.getValue());
}
outState.putParcelable(KEY_FRAGMENT_STATES, fragmentStates);
}

你也可以看看FragmentStatePagerAdapter类(class)。它使用相同的方法来管理 ViewPager fragment 的状态。

更新:因此您的代码最终应该看起来像这样:

private Fragment mCurrentFragment;

public void navigateFragment(String tag, Fragment fragment,
boolean shouldAdd) {
FragmentManager manager = getSupportFragmentManager();
FragmentTransaction transaction = manager.beginTransaction();

if (shouldAdd) {
mStacks.get(tag).push(fragment); // push fragment on stack
}

if (mCurrentFragment != null) {
saveFragmentState(mCurrentFragment.getClass().getName(), mCurrentFragment);
}

mCurrentFragment = fragment;
restoreFragmentState(fragment.getClass().getName(), fragment);
transaction.replace(android.R.id.tabcontent, fragment);

if (shouldAdd) {
// You shouldn't use back-stack when managing fragment states by yourself.
transaction.addToBackStack(tag);
}

transaction.commit();
}

在此示例中,我使用 fragment 的类名作为 id,因此所有 fragment 必须具有不同的类。但是您可以使用任何其他唯一值作为 id。我必须提到的另一件重要的事情是,当你自己管理 fragment 状态时,你不应该使用 back-stack。 Back-stack 执行类似的状态管理,您可能会遇到冲突。

关于android - 如何在选项卡中没有后台堆栈的情况下维护 fragment 状态?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31089280/

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