让我们说在我的应用程序中有一些可能的导航流程(都是Fragments
)
A -> B -> C -> D -> E
A -> F -> B -> C
我希望能够返回到片段B
,无论事务堆栈深度如何(即,如果我当前正在显示E
或{{我不想跟踪1}})。我注意到可以标记片段,但以下代码似乎不起作用:
在C
创建片段fragment A
又称B
:
SocialViewFragment
然后在FragmentTransaction transaction = getSupportFragmentManager().beginTransaction();
// Method 1
transaction.add(R.id.fragment_container, frag, SocialViewFragment.FRAG_TAG).commit();
// Method 2
//transaction.replace(R.id.fragment_container, frag);
//transaction.addToBackStack(SocialViewFragment.FRAG_TAG).commit();
中,Fragment E
返回false(并且什么都不做),因为它无法找到标记?!
popBackStack
答案 0 :(得分:1)
看起来你混淆了两种不同类型的标签。
您可以传递给add()
的可选字符串参数是片段的标记,允许您稍后通过调用findFragmentByTag()
找到相同的片段。
传递给addToBackStack()
和popBackStack()
的可选字符串参数称为"名称"并用于识别FragmentManager的后栈中的特定事务。它不是Fragment标记,因为后面的堆栈条目表示可能有多个Fragment添加或删除的特定事务。
要正确使用后端堆栈名称,请确保使用非空字符串调用addToBackStack()
,然后稍后可以使用相同的字符串调用popBackStack()
以弹出该特定事务。
另请注意,在add()
来电时,您根本不会致电addToBackStack()
。因此,mgr.getBackStackEntryCount()
将为0,并且您的popBackStack()
调用将永远不会发生(除非您已将其他片段添加到后台堆栈中。)
答案 1 :(得分:0)
为了popBackStack,你应该首先添加ToBackStack。
使用代码中注释的方法:
FragmentTransaction transaction = getSupportFragmentManager().beginTransaction();
transaction.replace(R.id.fragment_container, frag);
transaction.addToBackStack(SocialViewFragment.FRAG_TAG).commit();