多less活动vs碎片?

介绍:

基本的“片段教程”模式是这样的:

  1. 在平板电脑上,左侧有一个列表,右侧是详细信息。
  2. 两者都是Fragments ,都在同一个Activity
  3. 在电话中,在一个Activity有一个Fragment列表。
  4. 用细节Fragment启动一个新的Activity

(例如Dianne Hackborn提供的Android 3.0 Fragments API和Fragments API指南 )

在这两个设备上,function在Fragments 。 (简单)

平板电脑上 ,整个应用程序是1个Activity ,在手机上有很多Activities


问题:

  • 是否有理由将手机应用分成许多Activities

这种方法的一个问题是,你在主要的平板电脑Activity ,以及在单独的电话Activities 复制了大量的逻辑

  • 在这两种情况下保留1 Activity模型是否容易,使用相同的逻辑来切换Fragments (只是使用不同的布局)?

这样,大部分的逻辑就驻留在Fragments本身中,而且只有一个Activity – 没有重复的代码。

另外我读到的有关ActionBarSherlock是,它似乎最好的Fragments而不是Activities (但我还没有与它合作)。

这些教程是简单的,还是我错过了这个方法中的一些重要的东西?


我们已经在办公室成功地尝试了两种方法 – 但是我即将开始一个更大的项目,并希望尽可能让事情变得简单。

一些相关问题的链接:

  • 困境:何时使用片段vs活动:
  • 模式何时使用活动转换与dynamic片段
  • Android – 我需要一些片段与活动和意见的澄清
  • Android中的活动或片段?
  • 多个片段和活动交互devise
  • 那么Android 3.0中片段的确切优势是什么?

更新

开始赏金问题 – 仍然不相信为什么我需要在我的平板电脑活动和每个电话活动中复制我的应用程序逻辑。

另外还发现了Square的一个有趣的文章,值得一读:

  • 倡导反对Android碎片

我同意教程是非常简单的。 他们只是介绍Fragments但我不同意这种模式。

我也同意,在许多活动中复制应用程序的逻辑并不是一个好主意(请参阅维基百科上的DRY原则 )。


我更喜欢ActionBarSherlock Fragments Demo应用程序使用的模式( 在这里下载和源代码 )。 与问题中提到的教程最接近的演示是在应用程序中称为“布局”的演示; 或源代码中的FragmentLayoutSupport

在这个演示中,逻辑已经被移出Activity并进入FragmentTitlesFragment实际上包含了改变Fragments的逻辑。 这样,每个活动都非常简单。 要复制许多非常简单的活动,其中没有任何逻辑是在活动内部,使其非常简单。

通过将逻辑放入碎片中, 不需要多次编写代码 ; 无论将碎片放入哪个活动,都可以使用。 这使得它比基本教程提出的更强大的模式。

  /** * Helper function to show the details of a selected item, either by * displaying a fragment in-place in the current UI, or starting a * whole new activity in which it is displayed. */ void showDetails(int index) { mCurCheckPosition = index; if (mDualPane) { // We can display everything in-place with fragments, so update // the list to highlight the selected item and show the data. getListView().setItemChecked(index, true); // Check what fragment is currently shown, replace if needed. DetailsFragment details = (DetailsFragment) getFragmentManager() .findFragmentById(R.id.details); if (details == null || details.getShownIndex() != index) { // Make new fragment to show this selection. details = DetailsFragment.newInstance(index); // Execute a transaction, replacing any existing fragment // with this one inside the frame. FragmentTransaction ft = getFragmentManager() .beginTransaction(); ft.replace(R.id.details, details); ft.setTransition(FragmentTransaction.TRANSIT_FRAGMENT_FADE); ft.commit(); } } else { // Otherwise we need to launch a new activity to display // the dialog fragment with selected text. Intent intent = new Intent(); intent.setClass(getActivity(), DetailsActivity.class); intent.putExtra("index", index); startActivity(intent); } } 

ABS模式的另一个优点是,您最终不会得到包含大量逻辑的平板电脑活动,这意味着您可以节省内存。 教程模式可以导致更复杂的应用程序中的一个非常大的主要活动; 因为它需要随时处理所有放在其中的碎片的逻辑。

总的来说,不要认为这是被迫使用许多活动。 把它看作是有机会把你的代码分成许多片段,并在使用它们的时候节省内存。

我认为你在正确的轨道上。 (是的,教程是过度简化)。

在平板电脑布局中,您可以使用单个活动并交换分段(在多个“窗格”中)。 在电话布局中,您可以为每个片段使用新的活动。

像这样:

在这里输入图像说明

这可能看起来像很多额外的工作,但通过使用手机的多个活动,您启用基本的生命周期和意图传递。 这也允许框架处理所有的animation和后备栈。

为了帮助减less代码,您可以使用BaseActivity并进行扩展。

所以,如果用户有平板电脑,你可以使用MyMultiPaneFragActivity或类似的东西。 此活动负责pipe理从片段和路由意图到正确片段的callback(例如search意图)

如果用户有一个电话,你可以用很less的代码使用常规的活动,并扩大MyBaseSingleFragActivity或类似的东西。 这些活动可能非常简单,5-10行代码(甚至更less)。

棘手的部分是路由意图和什么。 *(编辑:见下面更多)。

我认为这是推荐的方法是为了节省内存,降低复杂性和耦合性。 如果您正在交换碎片,则FragmentManager维护对该FragmentManager的引用。 它也简化了用户应该“运行”的内容。 这一设置也将活动生命周期中的片段中的视图,布局和逻辑分开。 通过这种方式,片段可以存在于单个活动中,也可以存在于另一个片段(两个窗格)中,也可以存在于三个窗格的Activity中等等。

*定期的意图路由的好处之一是你可以从后台堆栈的任何地方显式启动一个活动。 search结果就是一个例子。 (MySearchResults.class)。

请阅读更多信息:

http://android-developers.blogspot.com/2011/09/preparing-for-handsets.html

这可能是一个更多的前期工作,因为每个片段必须在单独的活动中运行良好,但通常是有好处的。 这意味着您可以使用替代布局文件来定义不同的片段组合,保持片段代码模块化,简化操作栏pipe理,并让系统处理所有后退堆栈工作。

从Udacity的Android Fundamentals课程 video中,Reto Meier的回答是相同的 。

有很多原因可以让你的应用分成不同的活动。

  • 有一个单一的整体活动增加了代码的复杂性,使其难以阅读,testing和维护。
  • 使创build和pipe理意图filter更难。
  • 增加了紧密耦合独立组件的风险。
  • 如果单个活动既包含敏感信息又包含可共享的信息,则更有可能引入安全风险。

一个好的经验法则是在上下文发生变化时创build一个新的活动。 例如,显示不同types的数据并从查看切换到input数据。

这种方法的一个问题是,你在主要的平板电脑活动中,以及在单独的电话活动中复制了大量的逻辑。

在主细节模式中,有两个活动。 一个在较大的屏幕上显示这两个片段,而在较小的屏幕上只显示“主”片段。 另一个在较小的屏幕上显示“细节”片段。

你的细节逻辑应该在细节片段中被捆绑。 因此,不存在与活动之间的细节逻辑相关的代码重复 – 细节活动仅显示细节片段,可能从Intent额外传递数据。

另外我读到的有关ActionBarSherlock的是,它似乎最好的碎片,而不是活动(但我还没有与它合作)。

由于ActionBarSherlock纯粹是本地操作栏的回溯,因此ActionBarSherlock与本地操作栏无关。

参考第一个问题“是否有理由将手机应用分成许多活动? – 是的。 它简单地归结为可用的空间,平板电脑为开发者提供了更多的空间,因此开发人员可以将更多的空间放在一个屏幕上。 Android告诉我们Activities可以提供一个屏幕 。 所以,你可以用平板电脑上的1个大屏幕做什么,因为没有足够的空间容纳所有的碎片,所以可能需要在手机上的多个屏幕上分布。