关于android:为什么片段,何时使用片段而不是活动?

Why fragments, and when to use fragments instead of activities?

在android api 11+中,谷歌发布了一个名为Fragment的新类。

在视频中,谷歌建议,只要有可能(Link1,Link2),我们应该使用片段而不是活动,但他们没有确切解释为什么。

片段的用途和它们的一些可能用途是什么(除了一些可以通过简单的视图/布局轻松实现的UI示例)?

我的问题是关于片段:

  • 使用片段的目的是什么?
  • 与使用活动/视图/布局相比,使用片段有哪些优点和缺点?
  • 奖金问题:

  • 你能给碎片一些真正有趣的用法吗?谷歌在视频中没有提到的事情?
  • 在片段和包含它们的活动之间进行交流的最佳方式是什么?
  • 当你使用片段时,最重要的事情是什么?你的经验中有什么提示和警告吗?

  • #1 & #2 what are the purposes of using a fragment & what are the
    advantages and disadvantages of using fragments compared to using
    activities/views/layouts?

    片段是Android创建可重用用户界面的解决方案。您可以使用活动和布局(例如通过使用include)来实现一些相同的事情。但是,片段从蜂巢和更高版本连接到Android API。让我详细说明一下;

    • ActionBar。如果您希望选项卡在上面导航您的应用程序,您很快就会看到ActionBar.TabListener接口提供了一个FragmentTransaction作为onTabSelected方法的输入参数。您可能会忽略这一点,并做一些其他聪明的事情,但是您将使用API,而不是它。

    • FragmentManager手柄?回来?以一种非常聪明的方式。返回并不意味着返回到上一个活动,就像常规活动一样。它意味着回到先前的片段状态。

    • 您可以使用酷酷的ViewPagerFragmentPagerAdapter创建滑动接口。FragmentPagerAdapter代码比常规适配器干净得多,它控制单个片段的实例化。

    • 如果你在尝试为手机和平板电脑创建应用程序时使用片段,你的生活会容易得多。由于这些片段与蜂窝+API紧密相连,所以您将希望在电话上使用它们,并重用代码。这就是兼容性库的用武之地。

    • 你甚至可以也应该为仅用于手机的应用程序使用片段。如果你想携带的话。我使用ActionBarSherlock和兼容性库创建"ICS外观"应用程序,这些应用程序在回到1.6版本时看起来完全相同。您可以获得最新的特性,如ActionBar,包括制表符、溢出、拆分操作栏、viewpager等。

    Bonus 2

    在片段之间交流的最佳方式是意图。当您在片段中按某个内容时,通常会使用其中的数据调用StartActivity()。意图被传递到您启动的活动的所有片段上。


    不知道你指的是什么视频,但我怀疑他们说你应该使用片段而不是活动,因为它们不能直接互换。在开发指南中实际上有一个相当详细的条目,请考虑阅读它了解详细信息。

    简而言之,片段生活在活动中,每个活动可以承载许多片段。与活动一样,它们具有特定的生命周期,与活动不同,它们不是顶级应用程序组件。片段的优点包括代码重用和模块化(例如,在许多活动中使用相同的列表视图),包括构建多窗格界面的能力(主要在平板电脑上有用)。主要缺点是(有些)增加了复杂性。通常,您可以用(自定义)视图以非标准且不太可靠的方式实现相同的功能。


    片段是应用程序的用户界面或行为的一部分,可以放在活动中,从而实现更模块化的活动设计。如果我们说一个片段是一种亚活性,那就没有错。

    以下是关于片段的要点:

  • 片段有自己的布局和自己的行为,并有自己的生命周期回调。

  • 您可以在活动运行时添加或删除活动中的片段。

  • 您可以在一个活动中组合多个片段以构建多窗格UI。

  • 一个片段可以在多个活动中使用。

  • 片段生命周期与其宿主活动的生命周期密切相关。

  • 当活动暂停时,活动中可用的所有片段也将停止。

  • 片段可以实现没有用户界面组件的行为。

  • 碎片被添加到Android 3(蜂巢)中的Android API中,API版本为11。

  • 更多详情,请访问官方网站,碎片。


    这是我在碎片上发现的重要信息:

    Historically each screen in an Android app was implemented as a separate Activity. This creates a challenge in passing information between screens because the Android Intent mechanism does not allow passing a reference type (i.e. object) directly between Activities. Instead the object must be serialized or a globally accessible reference made available.

    By making each screen a separate Fragment, this data passing headache
    is completely avoided. Fragments always exist within the context of a
    given Activity and can always access that Activity. By storing the
    information of interest within the Activity, the Fragment for each
    screen can simply access the object reference through the Activity.

    资料来源:https://www.pluralsight.com/blog/software-development/android-fragments


    片段在某些情况下特别有用,比如我们希望在所有页面中保留一个导航抽屉。您可以用您想要的任何片段来膨胀框架布局,并且仍然可以访问导航抽屉。

    如果您使用了一个活动,那么您就必须将抽屉放在所有产生冗余代码的活动中。这是片段的一个有趣用法。

    我对Android还不熟悉,但我仍然认为碎片对这种方式很有帮助。


    我知道这件事已经讨论得很透彻了,但我想再补充几点:

    • frags可用于填充Menus,并可单独处理MenuItem单击。从而为您的活动提供更多的调制选项。您可以在不了解活动的情况下执行上下文操作栏等操作,并且基本上可以将其与活动处理的基本内容(导航/设置/关于)分离。

    • 带有子frags的父frag可以为您提供进一步的选项来对组件进行模块化。例如,你可以很容易地交换碎片,在寻呼机中放置新碎片,或者移除它们,重新排列它们。所有这些都没有你的活动知道任何关于它的事情,只是专注于更高层次的东西。


    活动是带有工具栏的应用程序中的全屏组件,其他内容最好是片段。一个带有工具栏的全屏父活动可以有多个窗格、可滚动页面、对话框等(所有片段),所有这些都可以从父活动访问并通过父活动进行通信。

    例子:

    活动A、活动B、活动C:

    • 所有活动都需要重复相同的代码,以显示基本的例如,工具栏,或从父活动继承(变为管理起来很麻烦)。
    • 要从一个活动移动到另一个活动,要么所有的活动都需要在内存中(开销),要么需要销毁其中一个活动以打开另一个活动。
    • 活动之间的沟通可以通过意图来完成。

    VS

    活动A,片段1,片段2,片段3:

    • 没有重复的代码,所有的屏幕都有工具栏等。
    • 从一个片段移动到下一个片段的几种方法-查看寻呼机、多窗格等。
    • 活动具有大多数数据,因此所需的片段间通信最少。如果仍然需要,可以通过接口轻松完成。
    • 片段不需要全屏显示,在设计它们时有很大的灵活性。
    • 如果不需要视图,片段不需要展开布局。
    • 多个活动可以使用相同的片段。

    1.使用片段的目的?

    • Ans:
    • 处理设备形状因子差异。
    • 在应用程序屏幕之间传递信息。
    • 用户界面组织。
    • 高级用户界面隐喻。

    碎片存在于活动中,并且具有:

    • 它自己的生命周期
    • 自己的布局
    • 它自己的孩子碎片等等。

    将片段视为它所属主活动的子活动,它不能单独存在,并且可以一次又一次地调用/重用它。希望这有帮助:)


    活动中有一个片段。

    当一个活动本身就存在的时候。