我正在使用Android兼容性库来实现片段并扩展了布局示例,以便片段包含一个触发另一个片段的按钮.
在左侧的选择窗格中,我有5个可选项 - A B C D E.
每个都FragmentTransaction:replace在详细信息窗格中加载一个片段(via ) -a b c d e
现在我扩展了片段e以包含一个按钮,该按钮e1还会在详细信息窗格中加载另一个片段.我在片段e的onClick方法上做了这个,如下所示:
FragmentTransaction ft = getActivity().getSupportFragmentManager().beginTransaction();
ft.replace(R.id.details_frag, newFrag);
ft.setTransition(FragmentTransaction.TRANSIT_FRAGMENT_OPEN);
ft.addToBackStack(null);
ft.commit();
Run Code Online (Sandbox Code Playgroud)
如果我做出以下选择:
E - e - e1 - D - E
Run Code Online (Sandbox Code Playgroud)
然后片段e在详细信息窗格中.这很好,我想要的.但是,如果我back在此时按下按钮它什么都不做.我必须点击两次,因为e1它仍然在堆栈上.点击后我在onCreateView中得到一个空指针异常:
为了"解决"这个问题,无论何时A B C D E选择,我都添加了以下内容:
FragmentManager fm = getActivity().getSupportFragmentManager();
for(int i = 0; i < fm.getBackStackEntryCount(); ++i) {
fm.popBackStack();
}
Run Code Online (Sandbox Code Playgroud)
只是想知道这是否是正确的解决方案或我是否应该做一些不同的事情?
我有一个客户代码.所有片段只有一个活动,即单个活动管理所有片段.
此活动包含该片段方法末尾的任何片段的以下代码 -
例如 - 片段MoreFragment:
MoreFragment firstFragment = new MoreFragment();
getSupportFragmentManager().beginTransaction()
.replace(R.id.article_fragment, firstFragment)
.addToBackStack(null).commit();
Run Code Online (Sandbox Code Playgroud)
所以,
1)addToBackStack(null)后面跟一个是什么意思commit()?
2)为什么需要传递null参数addToBackStack?
3)如何在这样添加之后获取该片段?
似乎这个代码没用,因为我运行没有最后一行的代码.addToBackStack(null).commit(),它运行没有任何问题.