android - 我应该替换片段还是修改当前片段?
问题描述
可以在代码中动态添加/替换/删除片段。我一直在我的项目中使用这种方法。
但是我想知道如果不是创建一个新片段并添加它或替换当前片段,我们只是抓住当前片段的句柄并修改它,会有什么区别(主要在性能方面)。
例如,考虑这个简单的场景,片段的唯一目的是显示图像,而我们想要修改该图像:
选项 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更高效?
解决方案
通过以下信息可能会得到澄清
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 膨胀时或在事务中添加时提供的之前定义的。
推荐阅读
- php - 我正在尝试在同一部分发送三个 mysql 准备好的语句
- vb.net - VB6 VS2015 中的“无法解析 mscorlib ....NETFramework,Version=v2.0”
- go - 如何计算 pprof 输出并避免 pprof 丢弃其 cum 小于 0.10s 的节点
- javascript - 视频播放仅限于 1920x1080 视频时滚动不连贯
- c++ - sqlite 在 Windows 上的编译时不链接
- python-3.x - 需要帮助理解代码执行,用于嵌套的 for 循环
- pybind11 - 如何绑定接受来自外部库的类型的函数
- python - python,字符串,输入和整数,卡在问题的 C 部分
- android-studio - 如何修复错误 lkotlin.UninitializedPropertyAccessException:lateinit 属性适配器尚未在我的代码中初始化?
- python-3.x - secureScores 端点返回无