【发布时间】:2015-02-18 10:34:35
【问题描述】:
我对 backstack 行为有疑问。这就是我正在做的:
add(fragment1) + addToBackStack(null)
replace(fragment2) + addToBackStack(null)
发生了什么:
- 片段 1 已添加并在后台堆栈中
- 然后第二个片段替换第一个片段并添加到后台堆栈中。
现在我想用一个新的事务来更改我的最后一个 backstacked 片段,该事务放置一个新的 backstack 片段,所以:
[frag1, frag2] becomes [frag1, frag3]
但是popBackStack + replace 进行的此事务正在通过调用onCreateView 和onActivityCreated 来加载frag1。我知道这是预期的行为,因为这是 backstack 的工作方式,但我正在尝试找到一种方法来避免这种预加载。
编辑
在这个问题中,我使用 backstack 片段的概念来使交易更加清晰。这里的每笔交易都是一个添加+删除(这是一个替换)。 我正在使用的替换代码是:
public int replaceFragment(BaseFragment newFragment, boolean addToBackStack, boolean animated, PopStackMode popMode) {
if (popMode != null) {
getSupportFragmentManager().popBackStack(newFragment.getFragmentTag(), popMode == PopStackMode.POP_INCLUSIVE ? FragmentManager
.POP_BACK_STACK_INCLUSIVE : 0);
}
FragmentTransaction ft = getSupportFragmentManager().beginTransaction();
if (animated) {
ft.setCustomAnimations(R.anim.slide_in_left, 0, R.anim.slide_out_right, 0);
}
ft.replace(R.id.fragment_container, newFragment, newFragment.getFragmentTag());
if (addToBackStack) {
ft.addToBackStack(newFragment.getFragmentTag());
}
return ft.commit();
}
您可以看到我正在创建基于片段 backstack 的导航历史记录,因为它是一种浏览器。当添加一个“页面”时,会有一个片段和一个 backstack 事务。在这种情况下,我试图:
- 删除当前片段。
- 从后台删除事务。
- 添加一个新片段而不弹出和加载前一个回栈片段。
我希望它更清楚。
编辑 2
我已经为支持此行为的标志填写了请求功能。找到它here。
【问题讨论】:
-
您可以使用嵌套片段在您可能希望篡改的每个后堆栈层分配一个容器片段,并只需更改子片段。
-
除非听起来不错,否则如果您替换容器中父级的视图并将事务添加到后台堆栈会发生什么?它将像现在一样重新创建视图。我需要在用于导航的容器之上添加一个新容器以添加此行为。不是吗?
-
我没有真正理解你的问题,但是嵌套的子替换不应该添加到后堆栈中。容器本身将是后栈上的一层,而子容器将是可动态替换的(不会篡改后栈)。
标签: android android-fragments fragment-backstack