我有一个始终可见的片段。我不明白为什么我应该使用bundle来从活动中传递数据。
这里的大多数问题都推荐这种传递数据的方法:
Bundle bundle=new Bundle();
bundle.putString("name", "From Activity");
Fragmentclass fragobj=new Fragmentclass();
fragobj.setArguments(bundle);
我更喜欢在活动的OnCreate函数中创建Fragment对象,然后使用此对象来显示片段(FragmentTransaction.add)。因为我对这个片段有所依赖,所以我可以在其中创建创建函数showName()并从这样的活动中调用它:
myFragment.showName("name");
这种方法有什么问题吗?
答案 0 :(得分:7)
每个片段必须有一个空构造函数,因此可以在恢复其活动状态时进行实例化。强烈建议子类没有带参数的其他构造函数,因为在重新实例化片段时不会调用这些构造函数。相反,参数可以由调用者使用setArguments(Bundle)提供,稍后由Fragment使用getArguments()检索。
这就是为什么最好使用bundle并以这种方式设置Fragment的参数,系统在重新实例化片段时更容易恢复其值。
现在,我不会使用myFragment.showName("name");
,因为您不知道片段的生命周期是否已经完成(附加到活动并使视图膨胀),所以相反,我会调用{{ 1}}在showName("name")
或onActivityCreated
回调中。
应用程序通常不应该实现构造函数。第一个应用程序代码可以在片段准备好使用的地方运行在onAttach(Activity)中,片段实际上与其活动相关联。某些应用程序可能还希望实现onInflate(Activity,AttributeSet,Bundle)以从布局资源中检索属性,但这里应该注意,因为片段附加到其活动时会发生这种情况。
答案 1 :(得分:2)
这种设置一个关闭数据值的方法没有任何问题,您只需要小心确保您想要设置名称的视图实际上存在于调用showName方法的位置。
使用Bundles传递信息的部分原因是它们可以使用键保存所有类型的数据,并且它们可以很容易地用于在设备轮换期间传递视图状态。最终,这是一个偏好问题,正是你的用例。