【问题标题】:Why use bundle to pass data to fragment?为什么要使用 bundle 将数据传递给分片?
【发布时间】:2016-06-11 15:47:31
【问题描述】:

我有一个始终可见的片段。我不明白为什么我应该使用 bundle 将数据从活动传递给它。

这里的大部分问题都推荐这种传递数据的方法:

Bundle bundle=new Bundle();
bundle.putString("name", "From Activity");
Fragmentclass fragobj=new Fragmentclass();
fragobj.setArguments(bundle);

我更喜欢在活动的 OnCreate 函数中创建 Fragment 对象,然后使用该对象显示片段(FragmentTransaction.add)。由于我参考了这个片段,我可以在其中创建 create 函数 showName() 并从这样的活动中调用它:

myFragment.showName("name");

这种方法有什么问题吗?

【问题讨论】:

  • 提示:当框架需要重新创建您的片段时会发生什么?
  • 我相信,注意 android 生命周期并使用例如reactiveX,@fefero 的建议现在完全有效。另见stackoverflow.com/a/9610048/1870447

标签: android android-fragments


【解决方案1】:

Android documentation 声明:

每个片段都必须有一个空的构造函数,因此可以在恢复其活动状态时对其进行实例化。强烈建议子类不要有其他带参数的构造函数,因为片段重新实例化时不会调用这些构造函数;相反,参数可以由调用者使用 setArguments(Bundle) 提供,然后由 Fragment 使用 getArguments() 检索。

这就是为什么最好使用 bundle 并以这种方式设置 Fragment 的参数,重新实例化 Fragment 时系统更容易恢复其值。


现在,我不会使用myFragment.showName("name");,因为您不知道片段的生命周期是否已经完成(附加到活动并膨胀视图),所以相反,我会调用showName("name") in onActivityCreatedonViewCreated 回调。

应用程序通常不应实现构造函数。可以在片段准备好使用的地方运行应用程序代码的第一个位置是 onAttach(Activity),片段实际与其活动相关联的点。一些应用程序可能还希望实现 onInflate(Activity, AttributeSet, Bundle) 以从布局资源中检索属性,但在这里应该小心,因为片段附加到其活动时会发生这种情况。

【讨论】:

    【解决方案2】:

    这种设置一次性数据值的方法没有任何问题,您只需要小心确保要在其上设置名称的视图在调用 showName 方法时确实存在。

    使用 Bundles 传递信息很受欢迎的部分原因是它们可以使用键保存所有类型的数据,并且它们可以很容易地用于在设备旋转期间传递视图状态。归根结底,这是一个偏好问题,以及您的用例究竟是什么。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2011-03-11
      • 2017-03-13
      • 2015-07-17
      • 2021-06-07
      • 2015-03-30
      • 2012-08-08
      • 1970-01-01
      • 2017-07-06
      相关资源
      最近更新 更多