gpt4 book ai didi

Android Reorder Fragment Backstack

转载 作者:IT老高 更新时间:2023-10-28 23:10:58 28 4
gpt4 key购买 nike

我的抽屉导航中列出了许多页面/fragment ,用户可能会经常在这些页面/fragment 之间切换,我希望它们在后台堆栈中以便他们可以导航回来,但我只想要每个 fragment 的一个实例后台堆栈,这样用户就不必疯狂地按回很多次来退出应用程序。我不知道如何在不删除页面的情况下有效地“重新排序”backstack。

目前,当我更改页面时,我正在使用此代码来更改 fragment 并确保它仅在后堆栈中一次

  if (mFragMgr == null) {
mFragMgr = getSupportFragmentManager();
}

String backStateName = fragmentDescriptor.name();
boolean fragmentPopped = mFragMgr.popBackStackImmediate(backStateName, 0);
if (!fragmentPopped){
mFragMgr.beginTransaction()
.remove((Fragment) mFragment)
.replace(R.id.content_frame, (Fragment) mFragment)
.addToBackStack(backStateName)
.commit();
}

我在 onBackPressed 中使用此代码

  @Override
public void onBackPressed() {
if (mFragMgr.getBackStackEntryCount() > 0) {
mFragMgr.popBackStackImmediate();
} else {
super.onBackPressed();
}
}

这可行,但这意味着它会删除我不想删除的页面。示例:

当我的用户以 A > B > C > D > E > C 的顺序访问 6 个页面时,因为我正在执行删除操作,所以我希望得到以下堆栈:

                            [E]    [C]
[D] [D] [E]
[C] [C] [C] [D]
[B] [B] [B] [B] [B]
[A] -> [A] -> [A] -> [A] -> [A] -> [A]

但我实际上得到的是以下内容 - 它会将所有内容弹出到与名称匹配的元素,这与我是否包含“.remove((Fragment) mFragment)”无关 - (I '现在已经意识到 remove 不会影响 backstack,所以无需指出这一点):

                            [E]
[D] [D]
[C] [C] [C] [C]
[B] [B] [B] [B] [B]
[A] -> [A] -> [A] -> [A] -> [A] -> [A]

如果我在添加到后台堆栈时不使用名称而是使用 null,我会得到以下信息:

                                   [C]
[E] [E]
[D] [D] [D]
[C] [C] [C] [C]
[B] [B] [B] [B] [B]
[A] -> [A] -> [A] -> [A] -> [A] -> [A]

我怎样才能得到我期望的行为?是否有可能,还是我需要自己记录更改并完全跳过后台堆栈?

最佳答案

没有API可以做到这一点,但因为上周我也在想同样的事情,
我把它当作一个练习,我自己实现了它。

我的方法允许你从 backstack 中的任何地方删除一个 Fragment,这是通过使用refrection 来修改将 backstack 信息存储在 FragmentManagerImpl 中的内部变量来实现的。和 BackStackRecord .

有几个重要的变量:

  • mBackStack - 存储 BackStackRecord,其中包含 Fragment 信息、先前的、动画等
  • mActive - 所有添加的Fragments
  • mAvailBackStackIndices - 存储新插入的记录可以使用的索引,即 mActive
  • null 值的索引
  • 及其他

使用 150 多个 Fragment 进行测试,没有发现任何泄漏,但仅在 DDMS 中监控堆,没有执行任何其他内存分析。
因此,由于某些内容可能被破坏,请探索代码,重新测试它,看看是否有人提供了更好的答案,然后重新考虑您是否真的需要在您的项目中这样做。

我将代码上传为 gist on GitHub ,希望对你有帮助。

关于Android Reorder Fragment Backstack,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21665346/

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