为什么不总是在一项活动中使用片段[关闭]

2024-02-25

为什么有人会创建活动而不是一个包含许多片段的活动?我发现使用片段可以更轻松地共享数据,而且您可以更好地使用 onpause 来确定应用程序是否进入后台或片段是否正在切换。

我错过了什么吗?

Thanks


(提前为冗长的答案表示歉意)

我认为没有什么可以阻止你这样做。

话虽如此,我如何看待活动是一个可以定义当前过渡的整个 UI 屏幕应如何显示的地方:它应包含哪些片段以及这些片段应如何并排放置,更重要的是,应用程序流程有效。

我的活动中的片段应该一起构成一个有意义的屏幕,具有我期望的功能并且应该可重复使用,但它们不应该知道其他片段的存在。这就是活动的工作。事实上,我强烈遵守这样的规则:一个片段永远不应该知道另一个片段的存在(尽管现在您可以将片段包含在片段中,这有点违背了这一点)。如果我需要转换到一组完全不同的用例,我更喜欢使用活动来处理转换以及要使用的新布局和片段集。

我必须这样做吗?不。我可以在一个主要活动中完成这一切,并自己完成这些“准活动片段”之间的转换,但是当已经有一个框架可以为我完成这件事时,我为什么要这样做呢?使用意图来初始化活动(转换)比手动编写自己的引擎要简单得多,也更干净,该引擎可以跟踪所有片段的状态并决定启动哪些片段以及删除哪些片段。

同样,使用活动中的内置功能处理不同的方向和设备尺寸比您自己处理更容易,但同样,没有什么可以阻止您这样做。

在一个例子中更容易解释这一点:

想象一下这个用例:我需要编写一个显示歌曲和电影列表的应用程序。当我单击其中一首歌曲时,它应该打开一个媒体播放器并在单独的屏幕中播放,当我单击一部电影时,它应该打开一个视频播放器并播放视频。这里有明显的过渡:从主列表到音频播放器或视频播放器并返回。

仅使用一个活动和 3 个片段来执行此操作,我必须用适当的媒体播放器片段(视频/音频)替换列表片段,并在用户单击列表项时自行删除列表片段(以保留内存) 。这一切都很好而且很容易做到,但是如果我还必须添加一种向歌曲/电影添加评论的方法会发生什么?现在我必须修改我的主要(也是唯一)活动,以了解如果有人正在播放歌曲并单击评论按钮的行为,我需要再次转换到另一个片段并允许该片段捕获/显示评论。

正如您可能想象的那样,每次添加新功能时,我都必须修改我的主要活动来处理转换,因为片段并不意味着彼此了解并且意味着彼此独立。

如果我只有一个活动,我最终要做的就是创建一个 God 类(我的主要活动),其中定义了我的应用程序的整个流程。随着应用程序变得复杂,维护这个流程也会变得越来越复杂。同样,这是按照具有独立片段的原则进行的。如果你不关心你的片段彼此了解,那是完全不同的,但在我看来,你做错了:)

我将如何使用活动来做到这一点?我仍然会有 3 个碎片,但也会有3 个活动,其唯一作用是维持与其他活动之间的转换并定义应使用哪个片段。从列表活动到歌曲活动之间的转换是一个简单的意图,并且释放内存是为我完成的。现在,如果歌曲活动需要转换为评论活动,那么这只是歌曲活动到评论活动的另一个意图。我根本不必更改列表活动,事实上,列表活动永远不会知道此评论活动的存在。

我知道这是一个非常简单的示例,但随着您的应用程序变得越来越复杂,并且随着您添加越来越多的用例,您会发现拥有多个活动是有意义的。您不想自己维护片段之间的转换,否则您最终会得到一个非常复杂的框架,该框架将慢慢变得难以维护。

根据屏幕的方向和大小,相同的逻辑将适用于具有不同的片段/布局。同样,无论如何,您可以在唯一的活动中自己处理这些问题,但问题是:为什么?

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

为什么不总是在一项活动中使用片段[关闭] 的相关文章

  • 如何快速自动发送FCM或APNS消息?

    我正在开发一项后端服务 通过 FCM 或 APNS 向移动应用程序发送推送通知 我想创建一个可以在一分钟内运行的自动化测试 并验证服务器是否可以成功发送通知 请注意 我不一定需要检查通知是否已送达 只需检查 FCM 或 APNS 是否已成功
  • 使用workmanager时Firestore脱机持久性错误

    我正在使用一个WorkManger定期从我的中检索信息Firestore当应用程序处于后台和前台时的数据库 此信息用于根据状态更新 UI 因此不同的状态会添加或删除 UI 的不同部分 第一次运行时效果很好 但是 一旦应用程序处于后台并且Wo
  • Android - 从资产中解析巨大(超大)JSON 文件的最佳方法

    我正在尝试从资产文件夹中解析一些巨大的 JSON 文件 我如何加载并添加到 RecyclerView 我想知道解析这种大文件 大约 6MB 的最佳方法是什么 以及您是否知道可以帮助我处理此文件的良好 API 我建议您使用GSON lib h
  • 找不到 com.google.firebase:firebase-core:9.0.0 [重复]

    这个问题在这里已经有答案了 在遵循有些不一致的指示之后here https firebase google com docs admob android quick start name your project and here http
  • CardView 圆角获得意想不到的白色

    When using rounded corner in CardView shows a white border in rounded area which is mostly visible in dark environment F
  • Android 模拟器插件无法初始化后端 EGL 显示

    我在 Cloudbees 上设置了 Jenkins 作业 并且可以在那里成功签出并编译我的 Android 项目 现在我想在 android 模拟器中运行一些 JUnit 测试并添加 Android 模拟器插件 我将 显示模拟器窗口 选项设
  • CollapsingToolBarLayout - 状态栏稀松布颜色不改变

    几天前我更新了我的 android studio 并开始使用 CoordinatorLayout 和 CollapsingToolbarLayout 只是尝试一些东西 工具栏稀松布颜色似乎覆盖了状态栏初始颜色和状态栏稀松布颜色 从 xml
  • Android SIP 来电使用带有广播接收器的服务

    大家好 其实我正在尝试创建一个应用程序 支持基于 SIP 通过互联网进行音频呼叫 这里使用本机 sip 我遇到了来电问题 我已经完成了服务的注册部分 但是在接听电话时我无法接听电话 请帮助我 Service file package exa
  • 如何使用 Cordova 获取当前安装的应用程序的版本?

    我已经找到了应用程序可用性插件 https github com ohh2ahh AppAvailability它主要检查用户是否在其设备上安装了某个应用程序 是否有可能获得应用程序的当前版本 开发者名称 重要 以及所有可能的信息 一般来说
  • 是否有 ADB 命令来检查媒体是否正在播放

    我想使用 ADB 命令检查根植于终端的外部设备中是否正在播放音频 视频 我无法找到任何 ADB 命令 如果有 我尝试过 adb shell dumpsys media player 我想要一个命令来指定视频是否正在运行 您可以使用以下命令查
  • 发布android后更改应用内购买项目的价格

    在 Google Play 上发布后 是否可以更改应用内购买商品的价格 我假设该应用程序也已发布 完整的在线文档位于http developer android com http developer android com也http sup
  • Google 云端硬盘身份验证异常 - 需要许可吗? (v2)

    我一直在尝试将 Google Drive v2 添加到我的 Android 应用程序中 但无法获得授权 我收到 UserRecoverableAuthIOException 并显示消息 NeedPermission 我感觉 Google A
  • Android访问远程SQL数据库

    我可以直接从 Android 程序访问远程 SQL 数据库 在网络服务器上 吗 即简单地打开包含所有必需参数的连接 然后执行 SQL 查询 这是一个私人程序 不对公众开放 仅在指定的手机上可用 因此我不担心第三方获得数据库访问权限 如果是这
  • Android Studio - Windows 7 上的 Android SDK 问题

    我对 Google i o 2013 上发布的最新开发工具 Android Studio 有疑问 我已经成功安装了该程序并且能够正常启动 我可以导入现有项目并对其进行编辑 但是 当我尝试单击 SDK 管理器图标或 AVD 管理器图标时 或者
  • Android向menuItem添加子菜单,addSubMenu()在哪里?

    我想根据我的参数以编程方式将 OptionsMenu 内的子菜单添加到 menuItem 中 我检查了android sdk中的 MenuItem 没有addSubMenu 方法 尽管你可以找到 hasSubMenu 和 getSubMen
  • .isProviderEnabled(LocationManager.NETWORK_PROVIDER) 在 Android 中始终为 true

    我不知道为什么 但我的变量isNetowrkEnabled总是返回 true 我的设备上是否启用互联网并不重要 这是我的GPSTracker class public class GPSTracker extends Service imp
  • 实现滚动选择 ListView 中的项目

    我想使用 ListView 您可以在其中滚动列表来选择一个项目 它应该像一个 Seekbar 但拇指应该是固定的 并且您必须使用该栏来调整它 我面临的一个问题是 我不知道这种小部件是如何调用的 这使得我很难搜索 所以我制作了下面这张图片 以
  • 捕获的图像分辨率太大

    我在做什么 我允许用户捕获图像 将其存储到 SD 卡中并上传到服务器 但捕获图像的分辨率为宽度 4608 像素和高度 2592 像素 现在我想要什么 如何在不影响质量的情况下获得小分辨率图像 例如我可以获取或设置捕获的图像分辨率为原始图像分
  • android sdk 的位置尚未在 Windows 操作系统的首选项中设置

    在 Eclipse 上 我转到 windows gt Android SDK 和 AVD Manager 然后弹出此消息 Android sdk 的位置尚未在首选项中设置 进入首选项 在侧边栏找到 Android 然后会出现一个 SDK 位
  • 如何将 google+ 登录集成到我的 Android 应用程序中?

    大家好 实际上我需要通过我的应用程序从 google 登录人们 现在我阅读了 google 上的文档 其中指出 要允许用户登录 请将 Google Sign In 集成到您的应用中 初始化 GoogleApiClient 对象时 请求 PL

随机推荐