如何从 MainActivity 获取当前片段

4

经过一些研究,我真的找不到答案。

我有一个带有侧边菜单和容器的单个活动。我有许多( 不支持 )片段,它们都使用相同的容器(一次只有一个)。

当用户使用菜单(它位于主要活动中)并转到另一页时,我希望将当前片段的名称添加到后退堆栈中(使用 .addToBackStack(Fragment1.class.getName())),但我找不到如何获取当前片段。

我不想实现接口等来跟踪当前片段。 使用fragmentManger 有一个超级简单的方式,不是吗?

5个回答

9
你可以像这样获取当前的片段:

您可以使用以下方式获取当前的片段:

if (getFragmentManager().getBackStackEntryCount() > 1) {
            Fragment f = getFragmentManager().findFragmentById(R.id.content_frame);
            if (f instanceof BlankFragment) {
                // Do something
            }
}

6

好的,

如果您想要从后退栈中获取最新的条目(感谢@AndroidGeek);

fragmentManager.getBackStackEntryAt(fragmentManager.getBackStackEntryCount()-1);

如果你想获取当前活动的片段(感谢@Salman500 @AndroidGeek);

Fragment f = getFragmentManager().findFragmentById(R.id.fragment_holder);

1

您可以使用此方法获取不支持片段的片段标识符。

Fragment fragment = getFragmentManager().findFragmentById(R.id.fragment_id);

    if(fragment!=null)
    {
        getFragmentManager()
                .beginTransaction()
                .addToBackStack(null)
                .commit();
    }

0

在执行片段事务的commit()之前,只需使用addToBackStack()即可。在这里查看

因此,您的代码将如下所示:

...
fragmentTransaction.replace(R.id.holder, newFragmentToShow, newFragmentTag);
fragmentTransaction.addToBackStack();
fragmentTransaction.commit();
...

编辑:在主题帖被编辑后

您无需使用片段类来调用addToBackStack(),如您在主题贴中提到的。字符串参数是可选字符串,只是为了保持回退堆栈状态。您应该查看文档

这一切都由内部管理,当前活动片段会自动添加到backStack中,您可以从任何地方调用它,它将始终使用当前活动片段。


问题是如何从主活动中获取当前活动的片段(或其类名)。 - Mohamed
主活动是替换片段的那个,不是吗?所以主活动应该已经知道它正在显示什么片段(使用一个变量即可)。至于添加到后退栈,您只需要在用新的片段替换当前片段之前使用addToBackStack()即可。 - zeekhuge
菜单不是我替换片段的唯一位置。它可以从片段内部更改。我知道第二部分。 - Mohamed
已编辑答案。 - zeekhuge
谢谢您的建议,但正如我所说,我不想自己跟踪它。我也知道它是如何工作的。它是堆栈,我只想获取位于其顶部的一个,就像.pop()一样。 - Mohamed

0

您可以在主活动中跟踪片段(使用变量)并在那里访问它们。例如:

FragmentManager manager = getSupportFragmentManager();
FragmentTransaction transaction= manager.beginTransaction();

MyFragment myFragment = new MyFragment();

myFragment.doSomething();

添加到后退栈:

FragmentTransaction fragment = getSupportFragmentManager().beginTransaction();
fragment.addToBackStack(fragment);
fragment.commit();

这个问题在这里得到了解答:获取当前显示的片段


问题在于我没有使用 support 库,所以无法使用 SupportFragmentManager。我能否不使用 support fragment 而使用它呢? - Mohamed

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