Android:返回到特定的Fragment(并弹出其后的所有内容)

3

假设在我的应用中有几个可能导航流程(全部都是片段

A -> B -> C -> D -> E
A -> F -> B -> C

我希望能够无论事务回退栈的深度如何都返回到片段 B。我不想跟踪当前显示的 EC。我注意到可以为片段打标签,但以下代码似乎不起作用:
片段 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();

然后在片段E中,popBackStack返回false(什么也不做),因为它找不到标签?!
FragmentManager mgr = PlaybackFrag.this.getActivity().getSupportFragmentManager();
if (mgr.getBackStackEntryCount() > 0) {
    // Want to go back to SocialViewFragment !!!    
    mgr.popBackStack(SocialViewFragment.FRAG_TAG, 0); // returns False - can't find the tag!                
}

“DOESNT WORK” 是什么意思?它会崩溃吗?它有任何反应吗?你的 LogCat 有任何提示吗? - Bryan Herbst
@Tanis.7x,两种方法都没有将指定标签的片段添加到堆栈中。没有崩溃。 - zx6r
2个回答

1

看起来你混淆了两种不同类型的标签。

add() 可以传递一个可选的字符串参数作为 Fragment 的标记,这样你可以通过调用 findFragmentByTag() 方法来找到相同的 Fragment。

addToBackStack()popBackStack() 传递的可选字符串参数被称为 "name",用于在 FragmentManager 的后退栈中识别特定的事务。它不是 Fragment 标记,因为后退栈条目表示可能具有多个 Fragment 添加或删除的特定事务。

要正确使用后退栈名称,请确保使用非空字符串调用 addToBackStack(),然后稍后您可以使用相同的字符串调用 popBackStack() 来弹出到该特定事务。

还要注意,在你的add()调用中,你根本没有调用addToBackStack()。因此,mgr.getBackStackEntryCount()将为0,你的popBackStack()调用根本不会发生(除非你已经将其他Fragment添加到了后退栈中)。

换句话说,'Method 2' 应该能够起作用...但是它却不行!此外,在第二种方法中,Fragment E 中的 getFragmentManager().findFragmentByTag(SocialViewFragment.FRAG_TAG); 返回 NULL。 - zx6r
你需要更加具体地描述问题,而不仅仅是“它不能工作”。使用第二种方法时,findFragmentByTag() 应该返回 null,因为正如我在帖子中提到的那样,Fragment 的标签和返回栈条目的名称是两个非常不同的东西。 - Bryan Herbst

0

为了弹出后退栈,您应该先添加到后退栈。

使用您代码中已注释的方法:

FragmentTransaction transaction = getSupportFragmentManager().beginTransaction();

transaction.replace(R.id.fragment_container, frag);
transaction.addToBackStack(SocialViewFragment.FRAG_TAG).commit();

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