【问题标题】:What's the proper way to return a result from an activity to a specific view?将活动结果返回到特定视图的正确方法是什么?
【发布时间】:2017-09-27 17:56:41
【问题描述】:

Android 新手。试图了解设计的技术缺点。

我有一个ItemSelectorView,它既有availableItems 集合,也有selectedItem 属性。后者在运行时与 V 形一起显示,让用户知道他们可以更改它。

在功能方面,它类似于微调器,除了不显示带有选项的弹出窗口外,它会启动名为 ItemSelectorActivity 的第二个活动,该活动显示启动它的 ItemSelectorView 中的所有可用项目,如以及有关每个选项的含义以及搜索和过滤功能的有用信息。

当用户选择一个时,他们的选择会通过MainActivityonActivityResult 覆盖返回给原始ItemSelectorView。然后覆盖确定它正在响应哪个ItemSelectorView 并将其转发。

但是,我真的不喜欢 MainActivity 必须将自己插入到流程中以从 ItemSelectorActivity 获取结果的方式。另外,如果在片段中使用了ItemSelectorView,那么将信息转发到正确的视图会变得更加复杂。

因此,我改为将ItemSelectorView 更改为ItemSelectorFragment,它可以覆盖自己的onActivityResult,使其负责使用所选结果更新自身,而不是其拥有的活动。这意味着它现在基本上是完全独立的。

虽然这似乎工作得很好——通过这种改变,用户只需将ItemSelectorFragment 放置在他们的布局中的某个位置并设置可用和选定的项目——这里一位资深的 Android 开发人员说使用这样的片段是错误的由于片段的开销,我应该留在视图中。

但是回到视图意味着我不得不再次让MainActivity 参与进来,这使得实际使用变得更加复杂。

那么使用这样的片段的技术缺点是什么?我认为这就是它们存在的全部意义所在。如果我应该使用视图,有没有更简单的方法可以从ItemSelectorActivity 获得结果?

【问题讨论】:

  • OnActivityResult 用于当您需要来自 ActivityB 的 ActivityA 信息时,如果您希望您的 ActivityB 本身是新鲜的,您可以在没有 onActivityResult 的情况下执行此操作
  • 片段中还有一个onActivityResult。另外,如上所述,ActivityA 不需要结果。 ActivityA 中的视图可以。出于这个原因,ActivityA 甚至不需要知道发生了什么,并且在使用所描述的片段的情况下,也不需要。
  • 我理解错了,你的意思是片段?如果是,那么您可以在没有 onActivityResult 的情况下执行此操作。

标签: android android-fragments onactivityresult


【解决方案1】:

如果我理解正确,您的视图正在启动一项活动(ItemSelectorView 启动 ItemSelectorActivity)。但应在 Android 中转储视图。它们应该显示,仅此而已。

所以视图不应该启动一个活动。一个视图可能包含一个项目列表,但这些项目应该是视图而不是别的。通常我们为此使用Adapter:在要显示的项目和为在屏幕上表示它们而创建的视图之间的中间人。

您可以查看 MVP 以正确方式执行此操作。或者也许 MVVM 和 android 架构,如果你更喜欢的话。

要回答您的问题,为您的用例使用片段是比视图更好的方法,而且根本没有太多开销。

【讨论】:

  • 回复:“显示,仅此而已。”和“不开始活动”我不同意,但只是一点点。在这种情况下,可以将选择器活动视为 ItemSelectorView 的 UI 的一部分。它恰好是一个活动,但它也是一个仅 ItemSelectorView 使用的活动。无处。把它想象成一个微调器,选择在另一个活动中。虽然它显示数据,但它并不拥有它。 (视图)模型可以。这就是为什么可以毫无问题地转储视图的原因,因为当它按预期恢复时,它只会重新水化它。
  • 我更多的是询问从选择活动返回到原始活动视图的纯通信,这与微调器的选择器更新微调器然后更新模型的方式相同。除此之外,这听起来也支持了我使用片段而不是我所追求的视图的愿望。谢谢!
  • 哦,忘了补充,ItemSelectorView 本身不需要适配器,因为它不显示选项。它只保存它们的数组(但又不拥有它)。但是,ItemSelectorActivity 确实使用了一个适配器,因为它负责显示从 ItemSelectorView 传递给它的集合。但最终模型拥有一切并负责设置这些属性,就像设置“文本”或“背景”或其他任何东西一样。在这种情况下,它不是一个字符串,而是一个数组。
  • 是的,片段似乎是您的最佳解决方案
猜你喜欢
  • 1970-01-01
  • 2013-09-12
  • 2018-08-12
  • 2021-10-29
  • 2010-12-03
  • 1970-01-01
  • 2014-05-03
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多