为什么要使用bundle将数据传递给片段?

fef*_*ero 2 android android-fragments

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

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

Bundle bundle=new Bundle();
bundle.putString("name", "From Activity");
Fragmentclass fragobj=new Fragmentclass();
fragobj.setArguments(bundle);
Run Code Online (Sandbox Code Playgroud)

我更喜欢在OnCreate活动函数中创建Fragment对象,然后使用该对象来显示片段(FragmentTransaction.add).因为我对这个片段有所依赖,所以我可以在其中创建create function showName(),并从这样的活动中调用它:

myFragment.showName("name");
Run Code Online (Sandbox Code Playgroud)

这种方法有什么问题吗?

Evi*_*n1_ 7

Android文档状态:

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

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


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

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


小智 2

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

使用 Bundle 传递信息流行的部分原因是它们可以使用键保存所有类型的数据,并且还可以轻松地用于在设备旋转期间传递视图状态。最终,这是一个偏好问题以及您的用例是什么。