我有一个客户代码。所有片段只有一个活动,即单个活动管理所有片段。
此活动包含该片段方法末尾的任何片段的以下代码 -
例如 - 片段MoreFragment:
MoreFragment firstFragment = new MoreFragment();
getSupportFragmentManager().beginTransaction()
.replace(R.id.article_fragment, firstFragment)
.addToBackStack(null).commit();
所以,
1)addToBackStack(null)
后跟commit()
是什么意思?
2)为什么需要将空参数传递给addToBackStack
?
3)如何在这样添加之后获取该片段?
似乎这段代码没用,因为我在没有最后一行.addToBackStack(null).commit()
的情况下运行代码并且运行没有任何问题。
答案 0 :(得分:85)
addToBackStack(null)后跟commit()?
的含义是什么?
引用文档:
通过调用addToBackStack(),替换事务将保存到 返回堆栈,以便用户可以反转事务并将其恢复 按“返回”按钮可以显示上一个片段。
如果您向交易添加多项更改(例如另一项添加() 或者删除())并调用addToBackStack(),然后应用所有更改 在调用commit()之前将其作为单个添加到后台堆栈中 事务和后退按钮将一起反转它们。
将更改添加到FragmentTransaction的顺序并不重要,除了:
您最后必须致电commit()
。如果您要将多个片段添加到同一容器中,则添加它们的顺序将决定它们在视图层次结构中的显示顺序。
所以你必须在最后提交。
为什么需要将null参数传递给addToBackStack?
它不需要为null,它可以是一个字符串。如果你不想要,只需传递null。
public abstract FragmentTransaction addToBackStack(String name)
在API级别11中添加 将此事务添加到后台堆栈。这意味着事务将在提交后被记住,并在稍后从堆栈中弹出时将反转其操作。
参数 name此后备堆栈状态的可选名称,或null。
关于:
似乎这个代码没用,因为我运行的代码没有最后一个 line .addToBackStack(null).commit(),它运行没有任何问题
如果要导航到上一个片段,请将其添加到backstack。所以这取决于你是否要将片段添加到backstack。
如何在这样添加后获取该片段?
您已经拥有片段实例firstFragment
。所以我以后不知道你的意思。
更多信息@
http://developer.android.com/guide/components/fragments.html
答案 1 :(得分:3)
tag
中的addToBackStack(String name)
字符串提供了一种定位后置堆栈的方法,以便以后直接弹出到该位置。它打算在方法popToBackStack(String name, int flags)
中使用:
从管理器的分片回栈中弹出最后一个分片过渡。该函数是异步的-它使弹出请求入队,但是直到应用程序返回其事件循环时才执行该操作。
name:如果不为null,则为要查找的先前返回状态的名称;如果找到,则将弹出该状态之前的所有状态。 POP_BACK_STACK_INCLUSIVE标志可用于控制是否弹出指定状态。如果为null,则仅弹出最高状态。
标志:0或POP_BACK_STACK_INCLUSIVE。
换句话说,它将弹出您的后栈,直到在name
中找到addToBackStack(String name)
添加的片段为止。
例如,如果您对片段管理器进行一系列添加或替换,并给出名称“ frag1”,“ frag2”,“ frag3”,“ frag4”,后来又想直接回到添加了addToBackStack(“ frag2”),您调用popToBackStack("frag2", 0)
。
所以
使用.addToBackStack("fragName")
:如果您想稍后popToBackStack(String name, int flags)
弹出多个后退堆栈。
使用.addToBackStack(null)
:如果您以后不想弹出多个后退堆栈,但仍然想一次弹出一个。即使您不会显式调用popToBackStack(),也可以执行此操作,而是让后按默认实现处理后堆栈。
使用.disallowAddToBackStack()
:如果您不想后按或显式调用popBackStack()。它将确保没有任何代码使用.addToBackStack()。
答案 2 :(得分:2)
您的答案已弃用。如果您不想将片段添加到后台堆栈,则应使用以下代码片段:
public static void replaceFragment (@NonNull FragmentManager fragmentManager,
@NonNull Fragment fragment, int frameId){
checkNotNull(fragmentManager);
checkNotNull(fragment);
FragmentTransaction transaction = fragmentManager.beginTransaction();
transaction.replace(frameId, fragment);
transaction.disallowAddToBackStack(); // <-- This makes magic!
transaction.commit();
}
下面你有可爱如何使用它的例子:
GameFragment fragment = GameFragment.newInstance(mGameObject, currentQuestion);
ActivityUtils.replaceFragment(getFragmentManager(), fragment, R.id.main);