经过一些研究,我真的找不到答案。
我有一个带有侧边菜单和容器的单个活动。我有许多( 不支持 )片段,它们都使用相同的容器(一次只有一个)。
当用户使用菜单(它位于主要活动中)并转到另一页时,我希望将当前片段的名称添加到后退堆栈中(使用 .addToBackStack(Fragment1.class.getName())
),但我找不到如何获取当前片段。
我不想实现接口等来跟踪当前片段。 使用fragmentManger 有一个超级简单的方式,不是吗?
经过一些研究,我真的找不到答案。
我有一个带有侧边菜单和容器的单个活动。我有许多( 不支持 )片段,它们都使用相同的容器(一次只有一个)。
当用户使用菜单(它位于主要活动中)并转到另一页时,我希望将当前片段的名称添加到后退堆栈中(使用 .addToBackStack(Fragment1.class.getName())
),但我找不到如何获取当前片段。
我不想实现接口等来跟踪当前片段。 使用fragmentManger 有一个超级简单的方式,不是吗?
您可以使用以下方式获取当前的片段:
if (getFragmentManager().getBackStackEntryCount() > 1) {
Fragment f = getFragmentManager().findFragmentById(R.id.content_frame);
if (f instanceof BlankFragment) {
// Do something
}
}
好的,
如果您想要从后退栈中获取最新的条目(感谢@AndroidGeek);
fragmentManager.getBackStackEntryAt(fragmentManager.getBackStackEntryCount()-1);
如果你想获取当前活动的片段(感谢@Salman500 @AndroidGeek);
Fragment f = getFragmentManager().findFragmentById(R.id.fragment_holder);
您可以使用此方法获取不支持片段的片段标识符。
Fragment fragment = getFragmentManager().findFragmentById(R.id.fragment_id);
if(fragment!=null)
{
getFragmentManager()
.beginTransaction()
.addToBackStack(null)
.commit();
}
在执行片段事务的commit()
之前,只需使用addToBackStack()
即可。在这里查看
因此,您的代码将如下所示:
...
fragmentTransaction.replace(R.id.holder, newFragmentToShow, newFragmentTag);
fragmentTransaction.addToBackStack();
fragmentTransaction.commit();
...
编辑:在主题帖被编辑后
您无需使用片段类来调用addToBackStack()
,如您在主题贴中提到的。字符串参数是可选字符串,只是为了保持回退堆栈状态。您应该查看文档
这一切都由内部管理,当前活动片段会自动添加到backStack中,您可以从任何地方调用它,它将始终使用当前活动片段。
您可以在主活动中跟踪片段(使用变量)并在那里访问它们。例如:
FragmentManager manager = getSupportFragmentManager();
FragmentTransaction transaction= manager.beginTransaction();
MyFragment myFragment = new MyFragment();
myFragment.doSomething();
添加到后退栈:
FragmentTransaction fragment = getSupportFragmentManager().beginTransaction();
fragment.addToBackStack(fragment);
fragment.commit();
这个问题在这里得到了解答:获取当前显示的片段
addToBackStack()
即可。 - zeekhuge