有多少活动与片段?(How many Activities vs Fragments?)

2019-06-18 02:25发布

介绍:

基本的“碎片教程”的格局基本是这样的:

  1. 在平板电脑上,有一个列表在左边,在右边的详细信息。
  2. 两者都是Fragments ,并都驻留在同一个Activity
  3. 在手机上,有一个列表Fragment在一个Activity
  4. 推出新的Activity与细节Fragment

(例如Android 3.0的片段API通过戴安Hackborn和片段API指南 )

在这两个设备,功能是在Fragments 。 (简单)

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


问题:

  • 是否有一个原因到手机应用程序分割成许多Activities

这种方法的一个问题 ,就是你在主平板复制了很多逻辑的 Activity ,并在不同的电话Activities

  • 岂不是更容易保持在两种情况下,1个活性模式,采用的开关相同的逻辑Fragments和缩小(只是使用不同的布局)?

这样大部分逻辑驻留在Fragments本身,并且仅存在单个Activity -的代码重复以下。

还有我所了解的ActionBarSherlock的是,它似乎工作最好的Fragments ,而不是Activities (但我没有用它尚未工作)。

都是过于简单的教程,或者有我错过了什么在这种方法主要?


我们在办公室里成功尝试这两种方法 - 但我要开始一个更大的项目,并希望使事情容易让自己成为可能。

有些链接到相关的问题:

  • 困境:当使用片段VS活动:
  • 模式时使用活动转移VS动态片段
  • Android的-我需要片段VS活动和观点的一些澄清
  • 活动或片段的Android?
  • 多个片段和活动的互动设计
  • 那么,什么是片段在Android 3.0的确切的优势是什么?

更新

在问题开始赏金 - 仍然不服气,为什么我要重复在我的平板电脑活动,并在每部手机的活动我的应用程序逻辑。

还发现,通过在广场的家伙,这是很值得一读一篇有趣的文章:

  • 提倡反对Android的碎片

Answer 1:

我同意教程被大大简化。 他们只是引进Fragments但建议我不要与模式一致。

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


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

在此演示,逻辑已经被移出的Activity并进入Fragment 。 该TitlesFragment实际上包含更改碎片的逻辑。 这样一来,每一项活动是非常简单的。 要复制很多非常简单的活动,其中没有逻辑的是活动里面,使得它非常简单。

通过将逻辑入片段,也没有必要写代码不止一次 ; 它是可用无论哪个活动的片段被放入。 这使得它比一个由基础教程提出了一个更强大的模式。

    /**
    * 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模式是您不含有大量的逻辑的平板活动结束了,这意味着你节省内存。 该教程模式会导致更复杂的应用有非常大的主要活动; 因为它需要处理所有的得到安置在任何时间碎片的逻辑。

总体而言,不认为它是被迫使用了许多活动。 把它看成是有机会到你的代码分割成许多碎片,并使用它们时节省内存。



Answer 2:

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

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

像这样:

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

为了帮助减少代码,你可以使用一个BaseActivity和扩展。

因此,如果用户拥有平板电脑你会使用MyMultiPaneFragActivity或类似的东西。 这种活性是负责从片段管理回调和路由意图到正确的片段(诸如搜索意图)

如果用户有一个手机,就可以使用普通的活动用很少的代码,并把它扩展MyBaseSingleFragActivity或类似的东西。 这些活动可以很简单,5-10行代码(甚至更少)。

最棘手的部分是路由的意图和诸如此类的东西。 *(编辑:详见下文)。

我认为这是推荐的方式的原因是为了节省内存,并降低复杂性和耦合。 如果你换出片段,该FragmentManager保持到碎片的回堆栈的参考。 它还简化了什么应该被“跑步”的用户。 这种设置还解耦从活动的生命周期在片段的观点和布局和逻辑。 这样的片段可以在单个活动存在,沿着另一片段(两窗格)中,或在三窗格活动等

*一个具有定期意图路由的好处是,你可以明确地从任何地方在后面堆栈推出的活动。 一个例子可能是在搜索结果的情况下。 (MySearchResults.class)。

有一个在这里阅读更多:

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

这可能是多一点的前期工作,因为每个片段必须通过独立的活动很好地工作,但它通常不负有​​心人。 这意味着你可以使用定义不同的片段组合替代布局文件,保持片段代码模块化,简化了操作栏的管理,并让系统处理所有的回栈工作。



Answer 3:

这里是雷托·梅尔的关于相同的答案,从拍摄这段视频的Udacity的Android基础课程 。

有许多原因你会破坏掉你的应用到不同的活动更好。

  • 有一个单一的整体活动增加了代码的复杂性,使得它难以阅读,测试和维护。
  • 使创建和管理意图过滤更难。
  • 增加的紧密耦合独立的组件的风险。
  • 使得它更可能带来安全风险,如果单一活动既包括可以安全地共享敏感信息和信息。

一个好的经验法则是每当环境的变化,以创建一个新的活动。 例如,显示不同种类的数据和在从观看到输入数据的切换。



Answer 4:

这种方法的一个问题,就是你在主平板活动复制大量的逻辑,并在独立的电话活动。

在主从模式中,有两个活动。 一个示出了在较大的屏幕和在小屏幕上仅“主”片段两个片段。 其他显示在小屏幕上的“细节”片段。

您的详细逻辑应该在细节片段被捆绑起来。 因此,存在活动之间的相关细节逻辑没有代码重复-详细活动仅仅显示细节片段,也许在数据传递从Intent额外。

还有我所了解的ActionBarSherlock的是,它似乎工作最好的片段,而不是活动(但我没有用它尚未工作)。

ActionBarSherlock没有更多的是与片段并不比本土行动起来吧,因为ActionBarSherlock是纯粹的原生操作栏的反向移植。



Answer 5:

参照一号问题“是否有一个原因到手机应用程序分割成许多活动?” - 是的。 它简单归结为可用的空间,一台平板提供了更多的空间来发展,从而使开发人员将更多的在一个屏幕上。 Android的告诉我们, 活动可以提供一个屏幕 。 所以,你可以用1个大屏幕上的平板电脑做什么,是什么,可能需要在多个屏幕上散布在手机上,因为没有足够的空间,所有的片段。



文章来源: How many Activities vs Fragments?