首页 > 解决方案 > 我应该替换片段还是修改当前片段?

问题描述

选项 1)创建我的 Fragment 类的新实例并替换当前显示的片段:

MyFragmentClass fr = new MyFragmentClass();
fr.setImage(1);
FragmentTransaction ft = getSupportFragmentManager().beginTransaction();
ft.replace(R.frame_layout_id, f)
...

选项 2) 只需获取对当前显示片段的引用并对其进行修改:

MyFragmentClass fr = (MyFragmentClass)
                fragmentManager.findFragmentById(R.id.frame_layout_id);
fr.setImage(1);

创建一个新的fragment实例并添加它的整个过程是否比调用findFragmentById更高效?

标签: androidperformanceandroid-fragments

解决方案


通过以下信息可能会得到澄清

1- fragmentTransaction.addToBackStack(str); 将此事务添加到后台堆栈。这意味着事务将在提交后被记住,并在以后从堆栈中弹出时将其操作反转。

2- fragmentTransaction.replace(int containerViewId, Fragment fragment, String tag) 它替换已添加到容器中的现有片段。

这本质上与为所有当前添加的片段调用 remove(Fragment) 相同,这些片段使用相同的 containerViewId 添加,然后使用此处给出的相同参数调用 add(int, Fragment, String)。

3- fragmentTransaction.add(int containerViewId, Fragment fragment, String tag) 添加一个fragment到activity状态。该片段还可以选择将其视图(如果 Fragment.onCreateView 返回非 null)放入活动的容器视图中。

替换已经存在的片段,将片段添加到活动状态并将活动添加到后台堆栈是什么意思?

有一个堆栈,所有处于运行状态的活动都保存在其中。片段属于活动。因此,您可以添加它们以将它们嵌入到活动中。

当您导航到当前布局时,您可以使用该容器的 id 将其替换为您想要的片段。

您还可以使用 popBackStack() 方法返回到 backStack 中的上一个片段。为此,您需要使用 addToBackStack() 将该片段添加到堆栈中,然后使用 commit() 进行反映。这与当前在顶部的顺序相反。

findFragmentByTag does this search for tag added by the add/replace method or the addToBackStack method ?

是否取决于您添加标签的方式。然后它只是通过它的标记找到一个片段,该标记是您在从 XML 膨胀时或在事务中添加时提供的之前定义的。


推荐阅读