首页 文章

活动与片段有多少?

提问于
浏览
179

简介:

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

  • 在平板电脑上,左侧有一个列表,右侧是详细信息 .

  • 两者都是 Fragments 并且都位于相同的 Activity 中 .

  • 在手机上,列表 Fragment 在一个 Activity 中 .

  • 使用详细信息 Fragment 启动新的 Activity .

(例如Android 3.0 Fragments API by Dianne HackbornFragments API Guide

在两个设备上,功能都在 Fragments 中 . (简单)

Tablet 上,整个应用程序是 1 Activity ,在 phone 上,有 many Activities .


问题:

  • Is there a reason to split the phone app into many Activities?

此方法的一个问题是,您复制了主Tablet Activity 中的大量逻辑,以及单独的Phone Activities 中 .

  • Would it not be easier to retain the 1 Activity model in both cases, using the same logic of switching Fragments in and out (just using a different layout)?

这样,大多数逻辑都驻留在 Fragments 本身,并且只有一个 Activity - 更少的代码重复 .

我所读到的关于 ActionBarSherlock 的内容是它似乎最好用 Fragments 而不是 Activities (但我还没有使用它) .

Are the tutorials oversimplified, or have I missed something major in this approach?


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

一些相关问题的链接:


更新

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

广场上的人们也发现了一篇有趣的文章,值得一读:

5 回答

  • 4

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

    在平板电脑布局中,您可以使用单个活动并交换进出碎片(在多个“窗格”中) . 在手机布局中,您可以为每个片段使用新的活动 .

    像这样:

    enter image description here

    这似乎是一项额外的工作,但通过为手机使用多个活动,您可以启用基本的Activity生命周期和Intent传递 . 这也允许框架处理所有动画和后端堆栈 .

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

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

    如果用户有手机,您可以使用非常少的代码的常规活动,并将其扩展 MyBaseSingleFragActivity 或类似的东西 . 这些活动可能非常简单,5到10行代码(可能更少) .

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

    我认为这是推荐方法的原因是节省内存并降低复杂性和耦合 . 如果要交换Fragments, FragmentManager 会为后端堆栈维护对该Fragment的引用 . 它还简化了用户应该'running'的内容 . 此设置还将Fragment中的视图,布局和逻辑与Activity生命周期分离 . 这样,片段可以存在于单个活动中,与另一个片段(双窗格)一起存在,或者存在于三窗格活动中,等等 .

    *具有常规意图路由的一个好处是,您可以从后端堆栈中的任何位置显式启动Activity . 一个例子可能是搜索结果 . (MySearchResults.class) .

    在这里阅读更多:

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

    这可能是一个更前期的工作,因为每个片段必须在不同的活动中很好地工作,但它通常会得到回报 . 这意味着您可以使用定义不同片段组合的替代布局文件,保持片段代码模块化,简化操作栏管理,并让系统处理所有后台堆栈工作 .

  • 6

    以下是Reto Meier关于此问题的答案,取自this videoUdacity's Android Fundamentals course .

    将您的应用程序分解为不同的活动有很多原因 . 单一的整体活动会增加代码的复杂性,使其难以阅读,测试和维护 . 使创建和管理intent过滤器变得更加困难 . 增加了紧密耦合独立组件的风险 . 如果单个活动包括敏感信息和可安全共享的信息,则更有可能引入安全风险 . 一个好的经验法则是在上下文发生变化时创建一个新的活动 . 例如,显示不同类型的数据,同时从查看切换到输入数据 .

  • 0

    提到"Is there a reason to split the phone app into many Activities?"的第一个问题 - 是的 . 它简单地归结为可用空间,平板电脑为开发人员提供了更多空间,从而允许开发人员在一个屏幕上放置更多空间 . Android告诉我们Activities can provide a screen . 所以你可以在平板电脑上使用1个大屏幕做什么,这可能需要分散在手机的多个屏幕上,因为没有足够的空间容纳所有人片段 .

  • 17

    此方法的一个问题是,您复制了主Tablet活动中的大量逻辑,以及单独的电话活动中的大量逻辑 .

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

    您的详细信息逻辑应该绑定在详细信息片段中 . 因此,没有与活动之间的细节逻辑相关的代码重复 - 细节活动仅显示细节片段,可能传递来自 Intent 额外的数据 .

    另外我读到的关于ActionBarSherlock的内容是它似乎最适合Fragments而不是Activities(但我还没有使用它) .

    ActionBarSherlock与片段的关系不再是本机操作栏,因为ActionBarSherlock纯粹是本机操作栏的后端 .

  • 41

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

    我也同意在多个活动中复制应用程序逻辑不是一个好主意(参见DRY Principle on wikipedia) .


    我更喜欢 ActionBarSherlock Fragments Demo app(download heresource code here)使用的模式 . 与问题中提到的教程最匹配的演示是应用程序中名为"Layout"的演示;或 FragmentLayoutSupport 在源代码中 .

    在此演示中,逻辑已移出 Activity 并进入 Fragment . TitlesFragment 实际上包含更改片段的逻辑 . 这样,每个Activity都非常简单 . 要复制许多非常简单的活动,其中没有任何逻辑在活动中,这使得它非常简单 .

    通过将逻辑放入片段,有 no need to write the code more than once ;无论片段放入哪个活动,它都可用 . 这使它成为比基本教程建议的模式更强大的模式 .

    /**
        * 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活动,这意味着您可以节省内存 . 教程模式可以在更复杂的应用程序中导致非常大的主要活动;因为它需要处理随时放入其中的所有片段的逻辑 .

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

相关问题