ChatGPT解决这个技术问题 Extra ChatGPT

有多少活动与片段?

介绍:

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

在平板电脑上,左侧有列表,右侧有详细信息。两者都是 Fragment 并且都驻留在同一个 Activity 中。在手机上,在一个 Activity 中有一个列表片段。使用详细信息片段启动一个新活动。

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

在这两种设备上,功能都在 Fragments 中。 (简单的)

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

问题:

是否有理由将手机应用程序拆分为多个活动?

此方法的一个问题是,您在主平板电脑 Activity 和单独的手机 Activities重复了很多逻辑

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

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

另外,我读到的关于 ActionBarSherlock 的内容是,它似乎与 Fragments 而不是 Activities 一起使用效果最好(但我还没有使用它)。

教程是否过于简单,或者我错过了这种方法的主要内容?

我们已经在办公室成功地尝试了这两种方法——但我即将开始一个更大的项目,并且想让事情对自己来说尽可能简单。

一些相关问题的链接:

困境:何时使用片段与活动:

何时使用活动转换与动态片段的模式

Android - 我需要对片段与活动和视图进行一些说明

Android中的活动或片段?

多片段和活动交互设计

那么 Android 3.0 中 Fragments 的确切优势是什么?

更新

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

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

反对 Android 碎片

+1 是一个很棒且写得很好的问题。
这几天让我很痛苦,目前我正在开发一个应用程序,该应用程序的设计包含很多片段,它将在手机和平板电脑中都可用,我正在寻找一种中间方式,但还没有找到...
老实说,我没有冒犯的意思,但我认为你只是接受了你想听到的,而不是真正的答案。谷歌不推荐 Scuba 的答案,我喜欢解释原因的博客文章。
@pjco 具体来说,我不同意在 Activity 中使用 onItemSelected() 方法。在我的“真实”应用程序中,我有很多列表和子列表。这种模式表明我的 Tab Activity 必须有一个 onItemSelected() 方法来处理每个列表。另外,电话活动必须在每个活动中都具有相同的逻辑重复。恕我直言,最好将 Item Selected 逻辑放入每个 Fragment - 没有重复,我更喜欢这种构建代码的方式。我希望这有帮助
我目前在工作中陷入了这个困境。片段的加载速度比启动新活动快得多,因此我开始实现单一活动架构。不过我遇到了一个问题,我似乎无法找到一个好方法来支持多片段配置而不做一些hacky。请参阅this question

S
Stephen Asherson

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

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

我更喜欢 ActionBarSherlock Fragments Demo 应用程序(download heresource code here)使用的模式。与问题中提到的教程最匹配的演示是应用程序中称为“布局”的演示;或源代码中的 FragmentLayoutSupport

在此演示中,逻辑已从 Activity 移到 FragmentTitlesFragment 实际上包含更改 Fragments 的逻辑。这样,每个Activity就很简单了。复制许多非常简单的活动,其中没有任何逻辑在活动内部,这使得它非常简单。

通过将逻辑放入 Fragments 中,无需多次编写代码;无论将 Fragment 放入哪个 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,这意味着您可以节省内存。教程模式可以在更复杂的应用程序中导致非常大的主要活动;因为它需要随时处理放置在其中的所有片段的逻辑。

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


thx 全面回答 - 我看过 ABS 演示,我认为那里有很多好的代码。我将尝试将我的大部分逻辑转移到片段中
演示应用程序已移至此处:play.google.com/store/apps/…
我认为您描述的模式来自原始 Google 示例代码:android-developers.blogspot.com/2011/02/… 我认为 ActionBarSherlock 只是将 Google 演示代码移植到使用 ABS 类。
p
pjco

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

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

像这样:

https://i.stack.imgur.com/ZhTP1.png

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

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

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

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

棘手的部分是路由意图等等。 *(编辑:见下文)。

我认为这是推荐方法的原因是节省内存并降低复杂性和耦合性。如果您要换出 Fragment,FragmentManager 会维护对该 Fragment 的引用以供后退堆栈使用。它还简化了应该为用户“运行”的内容。此设置还将 Fragment 中的视图、布局和逻辑与 Activity 生命周期分离。这样,Fragment 可以存在于单个 Activity 中,与另一个 Fragment 一起(两窗格)或三窗格 Activity 等。

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

在这里阅读更多信息:

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

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


关于 MySearchResults 的优势-您建议根据手机或平板电脑采用不同的方式响应该意图-为什么这比在两种情况下都响应的单个活动更好?您建议,在平板电脑上没有常规的意图路由 - 所以无论如何您都必须解决平板电脑的问题。为什么不在手机上也使用该解决方案?
这里的优点是您的平板电脑代码可以预期路由到多个窗格。有时您会希望在一个意图上更改多个窗格。例如左侧的搜索结果与右侧较大窗格中第一项的详细信息。此代码不能移植到单个布局。
为什么fragment很多的时候可以切换,但是如果只有1个fragment可见,就一定不能切换到另一个fragment?
不确定我理解您的意思,但澄清我上面的评论:有时您可能希望在多片段布局中同时更改多个片段。这需要代码更改 2 个片段,您不会在单个片段布局中重用这些片段
不客气:)如果您觉得答案有帮助,请点赞或接受
C
Community

这是 Reto Meier 的回答,取自 Udacity's Android Fundamentals coursethis video

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


有趣的是,视频的标题是“为什么我们不只使用片段”
这是一个很好的方法,我面临着单一活动多个片段的大量问题......可能是真正的经验
C
CommonsWare

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

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

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

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

ActionBarSherlock 与片段无关,与原生操作栏无关,因为 ActionBarSherlock 纯粹是原生操作栏的向后移植。


您对单一活动的想法有何看法?
@mattblang:只要导航正确,就没有问题。
我尝试重构为单个活动架构,因为替换片段比启动包含相同片段的新活动要快得多。我觉得我遇到了太多障碍,比如 this。我在网上找到的大多数示例,特别是对于主从配置等多片段配置,不使用单个活动。所以我有点进退两难。
E
EFlisio

参考第一个问题“是否有理由将手机应用程序拆分为多个活动?” - 是的。它只是归结为可用空间,平板电脑为开发人员提供了更多空间,从而允许开发人员在一个屏幕上放置更多内容。 Android 告诉我们 Activities can provide a screen。因此,您可以在平板电脑上使用 1 个大屏幕做的事情,可能必须在手机上的多个屏幕上展开,因为没有足够的空间容纳所有片段。


第一句话 - “一个活动是一个应用程序组件,它提供了一个用户可以与之交互以做某事的屏幕,”。我确实在我原来的陈述中看到了一个错误,我并不是说“是另一个屏幕”,