如何在Android中获取后退栈片段条目列表?

56

我正在开发一个应用程序,其中使用 FragmentActivity 实现选项卡。由于在整个应用程序中都需要选项卡,因此广泛使用片段来使应用程序与所有 Android 版本兼容。

因此,我面临的问题是难以直观地查看后台堆栈中存在哪些片段。我相信有一种方法可以检索出存在于后台堆栈中的片段列表。谢谢。

3个回答

110

FragmentManager有以下方法:

getBackStackEntryCount()

getBackStackEntryAt(int index)

FragmentManager fm = getFragmentManager();

for(int entry = 0; entry<fm.getBackStackEntryCount(); entry++){
   Log.i(TAG, "Found fragment: " + fm.getBackStackEntryAt(entry).getId());
}

12
getId 返回的是后退栈的 id 而不是片段的 id。 - eC Droid
7
因为错误的原因,你的回答被踩了。如果你使用findFragmentById()并使用这些id,你将无法找到一个片段。 - Bevor

0
我用这段代码(使用Kotlin)实现了对后退栈中片段的记录。
findNavController().backQueue.forEach {
        Log.d(TAG, "${it.destination}")
    }

这段代码遍历导航回退栈中的每个条目,并打印出Fragment的目标名称。

-2
如果您想检查哪个片段是可见的,并且知道片段所在视图的ID,则首先必须在onCreate()中添加以下内容。
    getSupportFragmentManager().addOnBackStackChangedListener(new OnBackStackChangedListener() {

  @Override
  public void onBackStackChanged() {
    Fragment f = getSupportFragmentManager().findFragmentById(R.id.content_frame);
    if (f != null){
      updateActionBarTitle(f);
    }

  }
});

private void updateActionBarTitle(Fragment fragment) {
        String fragClassName = fragment.getClass().getName();

        if (fragClassName.equals(FirstFragment.class.getName())) {
            setTitle("Home");
        } else if (fragClassName.equals(SecondFragment.class.getName())) {
            setTitle("Second");
        }
    }

这将在返回堆栈更改侦听器上更新您的操作栏标题。


4
这怎么是对所问问题的回答? - Neeraj Sewani
这似乎与所问的问题无关。 - Jüri Kiin

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接