静态碎片与动态碎片

问题描述 投票:15回答:1

使用XML中定义的静态片段而不是Java中的动态片段有什么优缺点?以下是类别:1。可维护性,2。兼容性和3.性能,4。UX

android android-layout android-fragments
1个回答
13
投票

通过XML使用片段或通过java代码动态地使用片段有很大的不同,这取决于您选择的主要区别在于用户如何体验应用程序的流程。

TLDR:下面的特性由通过XML实例化的片段和动态的Java代码(通过FragmentManager API)共享,但Java代码允许您在运行时更改,添加,删除每个片段,从而允许灵活性,否则将无法实现。

enter image description here

但要回答你的问题:

1 - 可维护性 - 大致相同,你使用android:name属性来定义你想要使用VS的fragment类:

// 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是一个简单的解决方案提供每种(和其他)设备配置的不同布局。 same app, different device configuration

资料来源:link

link

link

link

© www.soinside.com 2019 - 2024. All rights reserved.