首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >为什么我要避免在片段中使用非默认构造函数?

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

Stack Overflow用户
提问于 2012-08-22 04:57:50
回答 6查看 91.5K关注 0票数 174

我正在使用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;
    }....

而不使用非默认构造函数?

EN

回答 6

Stack Overflow用户

回答已采纳

发布于 2012-08-22 06:08:51

创建一个包对象并插入您的数据(在本例中是您的Category对象)。请注意,您不能将此对象直接传递到bundle中,除非它是可序列化的。我认为更好的做法是在片段中构建对象,并只将id或其他内容放入包中。下面是创建和附加bundle的代码:

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

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

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

就这样。

票数 112
EN

Stack Overflow用户

发布于 2013-04-17 00:53:58

似乎没有一个答案真正回答了“为什么使用bundle传递参数而不是非默认构造函数”。

之所以应该通过捆绑包传递参数,是因为当系统恢复fragment时(例如,在配置更改时),它将自动恢复您的bundle

onCreateonCreateView这样的回调应该从bundle中读取参数-这样就可以保证将fragment的状态正确地恢复到初始化fragment时所使用的状态(请注意,此状态可以与传递给onCreate/onCreateViewonSaveInstanceState bundle不同)

使用静态newInstance()方法的推荐只是一个推荐。您可以使用非默认构造函数,但请确保在该构造函数的主体内的bundle中填充了初始化参数。并在onCreate()onCreateView()方法中读取这些参数。

票数 278
EN

Stack Overflow用户

发布于 2013-03-25 17:58:20

由于FragmentManager实例化它的方式,你的Fragment不应该有构造函数。您应该有一个使用所需参数定义的newInstance()静态方法,然后将它们捆绑在一起,并将它们设置为片段的参数,稍后可以使用Bundle参数访问这些参数。

例如:

public static MyFragment newInstance(int title, String message) {
    MyFragment fragment = new MyFragment();
    Bundle bundle = new Bundle(2);
    bundle.putInt(EXTRA_TITLE, title);
    bundle.putString(EXTRA_MESSAGE, message);
    fragment.setArguments(bundle);
    return fragment ;
}

并在onCreate上阅读这些论点

@Override
public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    title = getArguments().getInt(EXTRA_TITLE);
    message = getArguments().getString(EXTRA_MESSAGE);

    //...
}

这样,如果分离并重新附加,则可以通过参数存储对象状态,这与附加到Intentbundles非常相似。

票数 52
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/12062946

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档