多少活动与片段?

简介:

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

  1. 在平板电脑上,左边是清单,右边是详细信息。
  2. 两者都是 Fragments,并且都位于同一 Activity中。
  3. 在电话上,有一个 在一个 Activity中列出 Fragment
  4. 启动具有详细信息 Fragment的新 Activity

(例如 Android 3.0片段 API 作者: Dianne Hackborn片段 API 指南)

在这两种设备上,功能都在 Fragments

平板电脑,整个应用程序是 1 Activity,在 电话,有 许多 Activities


问题:

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

一个 问题与这种方法,是你 重复了很多逻辑在主要的平板电脑 Activity,并在单独的电话 Activities

  • 在这两种情况下,保留1活动模式不是更容易吗, 使用切换 Fragments的相同逻辑(只是使用不同的布局) ?

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

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

教程是否过于简化了,或者我在这种方法中遗漏了什么重要的东西?


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

一些相关问题的链接:


最新情况

开始对问题慷慨-仍然不相信为什么我需要复制我的应用程序逻辑在我的平板电脑活动和每个手机活动。

我还发现 Square 的人写了一篇有趣的文章,非常值得一读:

35834 次浏览

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

在平板电脑的布局中,你可以使用一个单独的活动,交换进出片段(在多个“窗格”中)。而在电话布局中,你可以为每个片段使用一个新的活动。

像这样:

enter image description here

看起来似乎有很多额外的工作,但是通过在手机上使用多个活动,您可以启用基本活动生命周期和意图传递。这也允许框架处理所有的动画和回栈。

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

因此,如果用户有一个平板电脑,你会使用 MyMultiPaneFragActivity或类似的东西。这个活动负责管理来自片段的回调,并将意图路由到正确的片段(例如搜索意图)

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

棘手的部分是路由意图和诸如此类的东西。 * (编辑: 参见下面的更多内容)。

我认为这是推荐的方法,是为了节省内存,降低复杂性和耦合性。如果要更换片段,则 FragmentManager为回栈维护对该片段的引用。它还简化了应该为用户“运行”的内容。此设置还将片段中的视图、布局和逻辑与活动生命周期分离开来。这样,一个片段可以存在于单个活动中,与另一个片段(两个窗格)一起存在,或者存在于三个窗格的活动中,等等。

* 拥有常规意图路由的好处之一是,您可以从堆栈的任何地方显式地启动一个 Activity。一个例子可能是搜索结果。(MySearchResults.class).

点击这里阅读更多内容:

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

它可能需要更多的预先工作,因为每个片段必须在不同的活动之间工作得很好,但是它通常是有回报的。这意味着您可以使用其他布局文件来定义不同的片段组合,保持片段代码模块化,简化操作条管理,并让系统处理所有的回栈工作。

我同意这些教程是非常简化的。他们只是介绍了 Fragments,但我不同意建议的模式。

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


我更喜欢 ActionBarSherlock片段演示应用程序(请在此下载源代码在这里)使用的模式。与问题中提到的教程最接近的演示是应用程序中的“ Layout”,或者源代码中的 FragmentLayoutSupport

在这个演示中,逻辑已经从 Activity移到了 Fragment中。TitlesFragment实际上包含用于更改片段的逻辑。这样,每个活动都非常简单。要复制许多非常简单的 Activity,其中没有任何逻辑在 Activity 中,这使得它非常简单。

通过将逻辑放到片段中,就有了 不需要多次编写代码; 无论片段放到哪个活动中,它都是可用的。这使得它比基本教程建议的模式更强大。

    /**
* 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模式的另一个优点是,最终不会产生包含大量逻辑的 Tablet Activity,这意味着可以节省内存。在一个更复杂的应用程序中,教程模式可能导致一个非常大的主要活动; 因为它需要处理任何时候放入其中的所有片段的逻辑。

总的来说,不要认为它是被迫使用许多活动。可以把它想象成有机会将代码分割成许多片段,并在使用它们时节省内存。

这种方法的一个问题是,您在主 Tablet Activity 和单独的 Phone Activity 中复制了很多逻辑。

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

您的细节逻辑应该绑定在细节片段中。因此,不存在与活动之间的详细逻辑相关的代码复制——详细活动仅显示详细片段,可能传入来自额外 Intent的数据。

关于 ActionBarSherlock 我也读到过,它似乎在使用碎片而不是活动时效果最好(但我还没有使用过它)。

ActionBarSherlock 和本地动作栏没有更多的关系,因为 ActionBarSherlock 纯粹是本地动作栏的后台。

下面是 Reto Meier 关于同样问题的回答,摘自 Udacity 的 Android 基础课程这个视频

有很多原因让你最好把你的应用程序打入 不同的活动。

  • 拥有一个单一的整体活动会增加代码的复杂性,使其难以阅读、测试和维护。
  • 使得创建和管理意图过滤器更加困难。
  • 增加了紧密耦合独立组件的风险。
  • 如果单个活动同时包含敏感信息和可以安全共享的信息,就更有可能引入安全风险。

一个很好的经验法则是在上下文发生变化时创建一个新活动。例如,显示不同类型的数据以及从查看数据切换到输入数据时。

关于第一个问题“是否有理由将手机应用程序分成许多活动?”是的。它只是简单地归结为可用的空间,平板电脑给了开发人员更多的空间,从而允许开发人员在一个屏幕上放置更多的东西。 Android 告诉我们 活动可以提供一个屏幕。所以你能在平板电脑上用一个大屏幕做的事情,可能需要在手机上分散在多个屏幕上,因为没有足够的空间容纳所有的碎片。