确定是否在onBackStackChanged()中推送或弹出片段

时间:2015-10-07 22:55:30

标签: android android-fragments

说我已经将三个片段推到了堆栈上:片段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;
}

问题:有没有办法获取最后一个弹出的片段?或者有更好的方法去做我想做的事情吗?我可以随时保留一些变量,以确定我是不是弹出或推动,但我希望不那么狡猾的感觉。

感谢。

1 个答案:

答案 0 :(得分:1)

感谢@DeeV帮助我理解片段可见性。

  

如果您只是将碎片堆叠在一起,那么就FragmentManager而言,它们在技术上仍然是“可见的”并且是活动的。假设您的片段一次只能看到,您可以调用FragmentTransaction#hide(片段)来隐藏片段。片段#onHiddenChanged()将在您隐藏它和取消隐藏时被调用。

我会将我的代码转移到他们建议的内容。我也意识到,如果你确实需要像我之前那样手动完成,最后一个片段计数的变量将有助于确定它是推送还是流行。