在Android中使用Fragments而不是Views会有什么好处?

在为Android开发时,可以将目标(或最小)sdk设置为4(API 1.6),并添加android兼容包(v4)以添加对Fragments支持。 昨天我做到了这一点,并成功地实现了Fragments来可视化自定义类的数据。

我的问题是:使用Fragments的好处是什么,而不是简单地从一个自定义的对象获取视图,仍然支持API 1.5?

例如,说我有Foo.java类:

 public class Foo extends Fragment { /** Title of the Foo object*/ private String title; /** A description of Foo */ private String message; /** Create a new Foo * @param title * @param message */ public Foo(String title, String message) { this.title = title; this.message = message; }//Foo /** Retrieves the View to display (supports API 1.5. To use, * remove 'extends Fragment' from the class statement, along with * the method {@link #onCreateView(LayoutInflater, ViewGroup, Bundle)}) * @param context Used for retrieving the inflater */ public View getView(Context context) { LayoutInflater inflater = (LayoutInflater) context.getSystemService(Context.LAYOUT_INFLATER_SERVICE); View v = inflater.inflate(R.layout.foo, null); TextView t = (TextView) v.findViewById(R.id.title); t.setText(this.title); TextView m = (TextView) v.findViewById(R.id.message); m.setText(this.message); return v; }//getView @Override public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { if (container == null) { return null; } View v = inflater.inflate(R.layout.foo, null); TextView t = (TextView) v.findViewById(R.id.title); t.setText(this.title); TextView m = (TextView) v.findViewById(R.id.message); m.setText(this.message); return v; }//onCreateView }//Foo 

这两种方法都非常简单,可以在一个Activity中进行创build和处理,例如,有一个List<Foo>来显示(例如,以编程方式将每个添加到ScrollView ),所以Fragments真的很有用,或者它们只是通过上面的代码获得View的过度赞美简化?

使用碎片的主要原因是后台和生命周期function。 否则,自定义视图更轻,更容易实现。

起初,我尝试使用自定义视图来构build手机/平板电脑应用程序。 一切似乎都可以在手机和平​​板电脑上使用,甚至可以从单一面板切换到分割面板。 我遇到麻烦的地方是后退button和生命周期。 因为我只是手动更新视图…没有任何跟踪的意见和国家的历史。 因此,后退button无法按预期工作,而且在生命周期事件(如旋转应用程序)期间很难重新创build最新状态。 为了解决这个问题,我不得不将自定义视图封装在碎片中,并使用FragmentManager,以保存和重新创build之前的状态。

回答之后,我意识到在一年前发布了类似的问题: https //stackoverflow.com/a/11126397/618881

我会说Fragments在两种情况下是有用的:如果你在一些设备/方向上分割视图,并在两个活动中显示它们,并在其他设备上显示所有内容。 如果您使用平板电脑或甚至在手机上进行横向模式,那么这将是一个用例:例如,您在一个屏幕上显示项目列表和详细信息。 在电话或肖像模式下,您只需显示一个部分。

另一个用例是可重用的视图。 因此,如果您有一些视图在不同的活动中可见,并执行一些操作,则可以将此行为放入一个片段中,然后重新使用它。 显然你也可以用自定义小部件来做到这一点。

我不会看到为每个视图使用Fragments的任何理由,我想这只是一个开销。 我只是在第一个用例中使用它们,我在这里说这是一个简化。

Android在Android 3.0(API级别11)中引入了片段,主要用于在平板电脑等大屏幕上支持更加dynamic和灵活的UIdevise。 由于平板电脑的屏幕比手机的屏幕大得多,所以有更多的空间来组合和交换UI组件。 碎片允许这样的devise,而不需要你pipe理视图层次的复杂变化。 通过将活动的布局划分为片段,您可以在运行时修改活动的外观,并将这些更改保留在由活动pipe理的后退堆栈中。

在这里你可以阅读更多。

  1. 场景活动分割屏幕 – 我们有一个布局和一个处理左右屏幕部分的活动
  2. 场景FragmentActivity我们有一个主屏幕布局,一个左边一个右边

如果你有简单的应用程序,情况一好。

如果你想拥有多个片段和多个片段活动,你可以将每个片段结合起来,场景二是很好的。 你也可以在片段之间进行交互。

我有拆分屏幕Fragmentactivity我可以调用'意图额外',并告诉fragmentActivity哪个片段将被加载。 片段是好的,因为它们没有显示出来,所以你可以制作可重复使用的片段和FragmentActvity。

但是这会让你的项目变大。 但是,如果你做大项目,你可以节省很多。 因为您可以使用相同的片段或相同的片段活动。

而我这个碎片来得有点晚,所以你必须尝试以新的方式思考。 也许只是尝试将您的活动转换为FragmentActivity。 稍后尝试查找可重用的代码并从中创buildFragment。

它的有用,但我现在不知道如何。 但我有一些想法。

这总是问题。 Android团队做了一些思考,没有人知道什么是好的。 因为我们几乎没有这样的学习,所以这里有一些新的东西。

在我看来,这是好的,但不是因为谷歌告诉我们的理由。

在CustomView上使用Fragment或Activity时添加一个案例:

当您使用CursorLoader观察某些视图时,ListView或TextView,并且希望在后端更新ContentProvider的数据时更新它们的显示值(最常见的情况是您有一个服务通过从远程数据库/云周期性轮询数据来更新本地数据库)

上述所有评论中没有提到的一件大事是,即使Android杀死了活动,并且在您改变设备的方向时重新启动它,片段仍然保留在内存中。 这是出于性能的原因,但也可能导致意想不到的结果,如果你期望碎片被摧毁,只是发现他们正在从无处重build。