【问题标题】:findFragmentByTag() always return null - AndroidfindFragmentByTag() 总是返回 null - Android
【发布时间】:2014-11-18 07:12:32
【问题描述】:

在我的应用程序中,我有一个主要活动和几个片段。当用户单击后退按钮时,片段会一一弹出。我想确定当前在后台堆栈中的哪个片段。所以使用通过片段标签名称来识别片段。我使用以下代码段来获取片段标签名称,但它总是返回空值。

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);

【问题讨论】:

  • 你在 Fragment 中设置了 TAG 吗?
  • 查看我编辑的问题
  • 顺便说一句,findFragmentByTag() 行在哪里??
  • 我应该在哪里使用 findFragmentByTag()
  • 无论你想检查从堆栈中弹出的片段..Like this

标签: android android-fragments


【解决方案1】:

您需要在添加/替换时提及 TAG:

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();

希望对你有所帮助ツ

【讨论】:

  • 我使用了第一种方法来替换片段。但它总是返回空值。
  • 这样,FragmentManager fm = mainActivity.getSupportFragmentManager();FragmentTransaction ft = fm.beginTransaction(); ft.replace(R.id.activity_main_content_fragment, 片段, 文本);
  • 文本变量的值是多少?确保它不是“”
  • 我应该在哪里使用 getSupportFragmentManager().findFragmentByTag("fragment_tag_String");现在我正在使用上述方式来获取标签名称。 (FragmentManager fm = MainActivity.this.getSupportFragmentManager(); String fragmentTag = fm.getBackStackEntryAt(fm.getBackStackEntryCount() - 1).getName())
  • 你能获取fragmentTag中的TAG吗?
【解决方案2】:

我发现我的错误,是我忘记将 TAG 添加到后台堆栈。

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

然后我可以得到当前片段的TAG名称如下,

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

【讨论】:

  • 您不必致电addToBackStack() 即可使此呼叫生效。如果您希望片段管理器管理您的片段但又不让它在历史上被替换怎么办。这不应该是正确的答案。
  • addToBackStack 不是为了这个目的... Tag 和 addToBackStack 是不同的东西。
  • 不应该是这样的,但是如果fragment不在backstack中,findFragmentByTag()是找不到的。 “...请记住,Fragment 需要添加到您的 FragmentManager。如果您已删除()或替换()一个 Fragment 并且尚未将其添加到后台堆栈,您将无法找到它。 " medium.com/@bherbst/…
猜你喜欢
  • 2014-03-04
  • 1970-01-01
  • 2016-04-03
  • 2017-12-22
  • 2018-07-14
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多