为什么要避免在片段中使用非默认构造函数?


173

我正在使用创建一个应用程序,Fragments其中一个创建了非默认构造函数,并收到以下警告:

Avoid non-default constructors in fragments: use a default constructor plus Fragment#setArguments(Bundle) instead

有人可以告诉我为什么这不是一个好主意吗?

您还能建议我如何做到这一点:

public static class MenuFragment extends ListFragment {
    public ListView listView1;
    Categories category;

    //this is my "non-default" constructor
    public MenuFragment(Categories category){
        this.category = category;
    }....

是否不使用非默认构造函数?



3
不,这些无济于事。他们没有回答我的问题。但是,还是谢谢你:)
BlackHatSamurai 2012年

31
@BlaineOmega实际上,这个问题尤其如此:stackoverflow.com/a/11602478/321697肯定会回答您的问题。在方向更改或其他导致重新创建Fragment的事件上,Android使用默认构造函数以及作为参数传递的Bundle。如果您使用的是自定义构造函数,则由于这些事件之一而重新创建该片段时,您在自定义构造函数中所做的任何操作都会丢失。
凯文·科波克

1
谢谢,但这回答了原因,但没有回答如何。
BlackHatSamurai'8

我的原始评论的第一个和第二个链接涵盖了这一点。
CommonsWare,2012年

Answers:


110

创建一个捆绑对象,然后插入您的数据(在本例中为您的Category对象)。注意,除非将其可序列化,否则不能将其直接传递到包中。我认为最好在片段中构建对象,然后仅将id或其他内容放入包中。这是创建和附加包的代码:

Bundle args = new Bundle();
args.putLong("key", value);
yourFragment.setArguments(args);

之后,在您的片段访问数据中:

Type value = getArguments().getType("key");

就这样。


3
如何传递物体?我想传递一个上下文对象或任何其他对象。
Adil Malik

12
捆绑包可以包含序列化的Java对象以及Parcelable对象。另外,您不应传递a Context,因为可以通过片段的getActivity()method来访问该信息。
卡拉托阿

零碎在哪里做Type value = getArguments().getType("key");
穆罕默德·巴巴尔

4
@穆罕默德·巴巴尔(Muhammad Babar):如果我是您,请将其添加到newInstance()方法中。例如:public static FragmentName newInstance(your variables){}。如Android文档所建议,请勿使用参数构造函数,因为默认值(不带参数)将在片段重新启动后自动调用。
nistv4n

@MuhammadBabar onCreateView很好
chanjianyi
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.