findFragmentByTag()总是返回null - Android

11
在我的应用程序中,我有一个主活动和几个片段。当用户点击返回按钮时,片段一个接一个地弹出。我想确定当前在后台堆栈中的片段。因此,使用片段标记名称来识别片段。我使用以下代码段获取片段标记名称,但它总是返回null值。

在我的应用程序中,我有一个主活动和几个片段。当用户点击返回按钮时,片段一个接一个地弹出。我想确定当前在后台堆栈中的片段。因此,使用片段标记名称来识别片段。我使用以下代码段获取片段标记名称,但它总是返回null值。

FragmentManager fm = MainActivity.this.getSupportFragmentManager();
String fragmentTag = fm.getBackStackEntryAt(fm.getBackStackEntryCount() - 1).getName();

请帮忙。

编辑,

用标签替换片段,

FragmentManager fm = MainActivity.this.getSupportFragmentManager();
FragmentTransaction ft = fm.beginTransaction();
ft.replace(R.id.activity_main_content_fragment, fragment, text);

3
你是否在Fragment中设置了标签(TAG)? - SweetWisher ツ
请提供您所需要翻译的英文文本。 - user3800832
顺便问一下,findFragmentByTag()这个方法在哪里? - SweetWisher ツ
在哪些情况下应该使用 findFragmentByTag() 方法? - user3800832
无论您想在哪里检查从堆栈中弹出的片段.. 像这样 - SweetWisher ツ
是的,但问题是我有几个片段,无法传递片段标签名称。我想获取位于片段堆栈顶部的片段标签名称。 - user3800832
2个回答

27
您需要在添加/替换标签时提及该标签:

ft.replace(R.id.container, newFragment,"fragment_tag_String");

或者

ft.add(R.id.container, newFragment,"fragment_tag_String");
将片段添加到BackStack中:
ft.addToBackStack("fragment_tag_String");

然后你可以重新使用它

getSupportFragmentManager().findFragmentByTag("fragment_tag_String");

参考:

编辑 :

在执行事务后调用getSupportFragmentManager().executePendingTransactions()

FragmentManager fm = MainActivity.this.getSupportFragmentManager();
FragmentTransaction ft = fm.beginTransaction();
ft.replace(R.id.activity_main_content_fragment, fragment, text);
ft.commit();
fm.executePendingTransactions();

希望它能帮到你 ツ


3
我用了第一种方法来替换片段,但它总是返回空值。 - user3800832
像这样,FragmentManager fm = mainActivity.getSupportFragmentManager(); FragmentTransaction ft = fm.beginTransaction(); ft.replace(R.id.activity_main_content_fragment, fragment, text); - user3800832
我应该在哪里使用 getSupportFragmentManager().findFragmentByTag("fragment_tag_String"); 现在我正在使用上述方法来获取标签名称。(FragmentManager fm = MainActivity.this.getSupportFragmentManager(); String fragmentTag = fm.getBackStackEntryAt(fm.getBackStackEntryCount() - 1).getName()) - user3800832
你能够获取 fragmentTag 中的 TAG 吗? - SweetWisher ツ
是的,所有标签都已提交。问题在于当单击“返回”按钮时无法获取它们。 - user3800832
显示剩余2条评论

11

我发现了我的错误,我忘记将标签添加到后退栈中了。

FragmentManager fm = mainActivity.getSupportFragmentManager();
FragmentTransaction ft = fm.beginTransaction();
ft.replace(R.id.activity_main_content_fragment, fragment, text);
ft.addToBackStack(text);

然后,我可以按照以下方式获取当前片段的标签名:

FragmentManager fm = MainActivity.this.getSupportFragmentManager();
String currentFragmentTag = fm.getBackStackEntryAt(fm.getBackStackEntryCount() - 1).getName();

8
为了使这个调用起作用,您不应该必须调用 addToBackStack()。如果您希望片段管理器“管理”您的片段但不要在后退时替换它们,那么这不应该是正确的答案。 - Marvin
1
addToBackStack不是用于此目的的... 标签和addToBackStack是不同的东西。 - Sreekanth Karumanaghat
不应该是这样的,但如果片段不在后退栈中,findFragmentByTag()将无法找到它。 "...请记住,Fragment需要添加到您的FragmentManager中。如果您已经删除()或替换()了一个Fragment并且没有将其添加到后退栈中,则无法找到它。" - Felipe Kenji Shiba

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