使用XML中定义的静态片段而不是Java中的动态片段有什么优缺点?以下是类别:1。可维护性,2。兼容性和3.性能,4。UX
答案 0 :(得分:13)
通过XML使用片段或通过java代码动态地使用片段有很大的不同,这取决于您选择的主要差异将取决于用户如何体验应用程序的流程。
TLDR :以下特征由通过XML实例化的片段和动态的java代码(通过FragmentManager
API)共享,但Java代码允许您更改,添加,删除运行时的每个片段,允许灵活性,否则将是不可能的。
但要回答你的问题:
1 - 可维护性 - 大致相同,您使用android:name属性来定义要使用的fragment
类VS:
// get fragment manager
FragmentManager fm = getFragmentManager();
// add fragment
FragmentTransaction ft = fm.beginTransaction();
ft.add(R.id.your_placehodler, new YourFragment());
// alternatively add it with a tag
// trx.add(R.id.your_placehodler, new YourFragment(), "detail");
ft.commit();
在只有一笔交易的情况下,无论如何都没有任何努力。
2 - 兼容性:大致相同,两者都经常被开发人员使用
3 - 表现,一次性通胀过程可能会快一点,但它们基本上甚至。
4 - UX:根据您的需要,可能没有区别或 巨大的 。
那么XML或"动态片段"
之间的差异是什么呢?通过直接XML通胀实例化的片段不能在运行时通过FragmentManager动态管理。
例如,这意味着一旦您对片段/布局进行充气,您就无法将其发送到Backstack并快速提前另一个。片段的动态管理可用于在一个多用途活动中为用户提供快速的单流体验,如果您从一个活动跳到下一个活动,则无法获得该活动。
在上面的初始FragmentTransaction之后,您可以非常快速地为其他片段重复使用相同的布局容器
// replace
FragmentTransaction ft = fm.beginTransaction();
ft.replace(R.id.your_placehodler, new YourFragment());
ft.commit();
// remove
Fragment fragment = fm.findFragmentById(R.id.your_placehodler);
FragmentTransaction ft = fm.beginTransaction();
ft.remove(fragment);
ft.commit();
"那么为什么我们有XML实例化的片段?我们现在应该禁止它们!"
不是那么快,例如,您的目的只是在您的应用中使用多窗格窗口/布局在其生命周期内不会发生太大变化(即,如果您可以坚持使用该布局直到解除活动)xml通胀没有任何缺点,并且根据碎片的数量,你可以节省大量的样板FragmentTransactions代码。
另一个重要用例可以简单地准备使用其他设备Configuration
,例如屏幕尺寸,或不同的屏幕方向(例如,在平板电脑和手机纵向/横向)上使用应用时,XML是一种简单的解决方案,可为这些(和其他)设备配置提供不同的布局。
来源: link