说我已经将三个片段推到了堆栈上:片段A,B和C.
目标:当我按回片段C时,我想要确定片段B是否正在显示并调用frag.onShow()。
思维过程:我添加了一个onBackStackChangedListener,以确定何时从堆栈中添加或删除片段。在这里,我检查当前片段是否等于新片段(推送)或不同(弹出)。
问题:Frag和getCurrentFragment()都在片段C被解除后返回当前片段。所以这里的新片段是片段B,但getCurrentFragment()也返回片段B,所以它不认为它是流行音乐。
getSupportFragmentManager().addOnBackStackChangedListener(new OnBackStackChangedListener() {
@Override
public void onBackStackChanged() {
FragmentManager fm = getSupportFragmentManager();
int count = fm.getBackStackEntryCount();
if (count > 0) {
String name = fm.getBackStackEntryAt(count - 1).getName();
MyFragment frag = (MyFragment) fm.findFragmentByTag(name);
MyFragment currFrag = getCurrentFragment();
if (frag != currFrag) {
if (frag != null) {
frag.onShow();
}
}
}
}
});
public MyFragment getCurrentFragment() {
Fragment fragment = getSupportFragmentManager().findFragmentById(R.id.fragment_holder);
if (fragment instanceof MyFragment) {
return (MyFragment) fragment;
}
return null;
}
问题:有没有办法获取最后一个弹出的片段?或者有更好的方法去做我想做的事情吗?我可以随时保留一些变量,以确定我是不是弹出或推动,但我希望不那么狡猾的感觉。
感谢。
答案 0 :(得分:1)
感谢@DeeV帮助我理解片段可见性。
如果您只是将碎片堆叠在一起,那么就FragmentManager而言,它们在技术上仍然是“可见的”并且是活动的。假设您的片段一次只能看到,您可以调用FragmentTransaction#hide(片段)来隐藏片段。片段#onHiddenChanged()将在您隐藏它和取消隐藏时被调用。
我会将我的代码转移到他们建议的内容。我也意识到,如果你确实需要像我之前那样手动完成,最后一个片段计数的变量将有助于确定它是推送还是流行。