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 的情况下添加片段。

【讨论】:

但是将来如果我向堆栈中添加了多个片段并想要加载特定片段,那该怎么办? 传递一个 Fragment TAG 以便能够识别 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 用户权限 )

android 21 是啥版本

Android逆向-Android基础逆向(2-2)

【Android笔记】android Toast

图解Android - Android核心机制