Android FragmentTransaction.addToBackStack 混淆
Posted
技术标签:
【中文标题】Android FragmentTransaction.addToBackStack 混淆【英文标题】:Android FragmentTransaction.addToBackStack confusion 【发布时间】:2013-01-05 18:36:04 【问题描述】:我正在研究 Fragments,在区分 FragmentTransaction.replace(id, fragment, tag)
和 FragmentTransaction.addToBackStack(tag)
调用时有点困惑。假设我当前的片段是 FragmentA,然后我加载了 FragmentB。我希望将来,当我需要加载 FragmentA 时,我不必重新加载它。只需加载旧状态的旧版本。我使用了以下代码段:
public void loadFragment(Fragment fragmentB, String tag)
FragmentManager fm = getSupportFragmentManager();
View fragmentContainer = findViewById(R.id.fragment_container);
FragmentTransaction ft = fm.beginTransaction();
ft.replace(fragmentContainer.getId(), fragmentB, tag);
ft.addToBackStack(tag);
ft.commit();
现在我很困惑,我应该在哪里添加字符串标签?在replace()
或addToBackStack()
或两个电话中?你能解释一下这两个标签位置的区别吗?
【问题讨论】:
【参考方案1】:你能解释一下这两个标签位置的区别吗?
addToBackStack
的文档非常清楚:
此返回堆栈状态的可选名称,或 null。
而replace
:
片段的可选标签名称,以便稍后检索片段 使用 FragmentManager.findFragmentByTag(String)。
所以这两个参数是独立的,一个标识back stack,另一个标识Activity's FragmentManager
内的fragment。
从这个角度来看,您的代码似乎是正确的,只是我不会通过它的 id 搜索 fragmentContainer
视图,而只是使用它的 id 来替换片段。让它更简单:
public void loadFragment(Fragment fragmentB, String tag)
FragmentManager fm = getSupportFragmentManager();
FragmentTransaction ft = fm.beginTransaction();
ft.replace(R.id.fragment_container, fragmentB, tag);
ft.addToBackStack(null);
ft.commit();
如果您以后不需要识别此返回堆栈,请将 null 传递给 addToBackStack
。至少我一直在这样做。
【讨论】:
【参考方案2】:在此示例中,您不需要添加标签作为标识。 做吧:
ft.replace(R.id.fragment_container,fragmentB);
ft.addToBackStack(null);
ft.commit();
标签作为标识通常用于在没有 UI 的情况下添加片段。
【讨论】:
但是将来如果我向堆栈中添加了多个片段并想要加载特定片段,那该怎么办? 传递一个 FragmentTAG
以便能够识别 Fragment 将其添加到 BackStack 时:.addToBackStack(YourFragment.TAG);
因此您可以使用以下命令检查 Fragment 是否已经在 BackStack 中:getFragmentMangager().findFragmentByTag(YourFragment.TAG);
跨度>
ft.addToBackStack(null);这行代码的目的是什么?
developer.android.com/guide/components/fragments.html 向我们展示了 addToBackStack(null) 将确保事务也保存到后台堆栈。或者,您可以为此回栈状态使用名称。
什么是“这个backstack state的名字”?我的意思是,“backstack state”的目的是什么?【参考方案3】:
将 null 传递给 addtoBackStack(null) 意味着将片段添加到片段堆栈中,但不添加任何标记,以便在再次添加之前进一步识别堆栈中的特定片段。
.addToBackStack(null);
但是将 TAG 传递给 addToBackStack 有助于通过 TAG 识别 Fragment stack 中的片段。 喜欢
.addToBackStack(FragmentName.TAG);
现在我们可以在将片段添加到堆栈之前对其进行检查:
getFragmentManager().findFragmentByTag(SettingsFragment.TAG);
如果 Fragment 尚未添加,这将返回 null。
【讨论】:
【参考方案4】:传递给addToBackStack()
的参数可用于检索整个 BackStackEntry 对象,而不仅仅是单个片段。为了设置片段标签,请考虑使用 3 参数版本的 add(int, Fragment, String) 和 replace(int, Fragment, String)
在添加 Fragment 之前,您可以使用以下命令检查该 Fragment 是否已经在后台堆栈中:
getFragmentMangager().findFragmentByTag(SettingsFragment.TAG);
如果尚未添加 Fragment
,这将返回 null
。
【讨论】:
以上是关于Android FragmentTransaction.addToBackStack 混淆的主要内容,如果未能解决你的问题,请参考以下文章
Android 逆向Android 权限 ( Android 逆向中使用的 android.permission 权限 | Android 系统中的 Linux 用户权限 )
Android 逆向Android 权限 ( Android 逆向中使用的 android.permission 权限 | Android 系统中的 Linux 用户权限 )