为什么我要避免片段中的非默认构造函数?

内容来源于 Stack Overflow,并遵循CC BY-SA 3.0许可协议进行翻译与使用

  • 回答 (2)
  • 关注 (0)
  • 查看 (27)

我正在创建一个应用程序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;
    }....

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

提问于
用户回答回答于

创建一个包对象并插入数据(在本例中,Category对象)。小心,不能将这个对象直接传递到包中,除非它是可序列化的。我认为最好在片段中构建对象,并且只将一个id或其他东西放入包中。这是创建和附加一个包的代码:

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

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

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

用户回答回答于

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

应该通过包传递参数的原因是因为当系统恢复fragment(例如,在配置更改上),它将自动恢复bundle.

回调就像onCreateonCreateView应该从bundle-这样您就可以保证恢复fragment正确到相同的状态时,fragment初始化(请注意,此状态可能不同于onSaveInstanceState bundle传递给onCreate/onCreateView)

使用静态的建议newInstance()方法只是一个推荐。可以使用非默认构造函数,但要确保在bundle在构造函数的主体内。并在onCreate()onCreateView()方法。

扫码关注云+社区