可以在代码中动态添加/替换/删除片段。我一直在为项目使用这种方法。
但是我不知道如果不创建一个新片段并添加或替换当前片段,而只是抓住当前片段的句柄并对其进行修改,会有什么区别(主要是性能)?
例如,考虑一个简单的场景,其中片段的唯一目的是显示图像,而我们要修改该图像:
选项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);
创建新片段实例并添加它的整个过程是否比调用findFragmentById更有效?
答案 0 :(得分:0)
请仔细阅读以下信息
1-fragmentTransaction.addToBackStack(str); 将此事务添加到后台堆栈。这意味着该事务在提交后将被记住,并且在以后从堆栈中弹出时将撤消其操作。
2-fragmentTransaction.replace(int containerViewId,Fragment片段,字符串标记) 它替换了添加到容器中的现有片段。
这与为所有当前添加的片段调用remove(Fragment)相同,这些片段使用相同的containerViewId添加,然后使用此处给出的相同参数添加(int,Fragment,String)。
3-fragmentTransaction.add(int containerViewId,Fragment片段,字符串标记) 将片段添加到活动状态。该片段还可以选择将其视图(如果Fragment.onCreateView返回非空)进入活动的容器视图。
替换已经存在的片段,将片段添加到活动状态并将活动添加到后台堆栈是什么意思?
这里有一个堆栈,所有处于运行状态的活动都保留在其中。片段属于活动。因此,您可以添加它们以将其嵌入活动中。
导航到当前布局时,您具有该容器的ID,可将其替换为所需的片段。
您还可以使用popBackStack()方法返回backStack中的上一个片段。为此,您需要使用addToBackStack()在堆栈中添加该片段,然后使用commit()进行反映。这是相反的顺序,当前在最上面。
findFragmentByTag does this search for tag added by the add/replace method or the addToBackStack method ?
是否取决于您如何添加标签。然后,它只是根据您定义的标签找到一个片段,该片段在从XML扩展时或在事务中添加时提供时就定义了。