如何解决此片段“非默认构造函数”错误?

时间:2014-08-18 19:32:22

标签: android android-fragments

我继承了这款Android应用。当我尝试构建已签名的APK时,出现错误Error:(31) Error: Avoid non-default constructors in fragments: use a default constructor plus Fragment#setArguments(Bundle) instead [ValidFragment]

它指向这段代码:

public class BasicInfoFragment extends BasePassportFragment implements LocationEditText.LocationEditTextListener {

    private User user;
    private Templates templates;

    public BasicInfoFragment() {
        super(false);
    }

    public BasicInfoFragment(User user) {
        super(false);
        this.user = user;
    }

    public BasicInfoFragment(User user, Templates templates) {
        super(false);
        this.user = user;
        this.templates = templates;
    }

   ...

}

错误指向第2和第3种方法public BasicInfoFragment(User user)public BasicInfoFragment(User user, Templates templates),所以我很困惑为什么public BasicInfoFragment()可以,但其他两种方法没有?

1 个答案:

答案 0 :(得分:5)

  

我很困惑为什么公共的BasicInfoFragment()没问题,但其他两个不是?

当活动被破坏并作为配置更改(例如,屏幕旋转)的一部分重新创建时,Android会自动销毁并重新创建由旧活动实例管理的片段。为此,它将使用默认构造函数,而不是其他两个构造函数。

此外,当您在后台终止您的应用程序进程,并且用户返回您的应用程序(例如,最近任务列表)时,Android将创建一个全新的活动实例...并且所有它的碎片。再一次,它将使用默认构造函数。

使用其他构造函数的风险是,在上述任何一个事件中,传入这些构造函数的任何对象都容易丢失。 Lint指导您摆脱那些构造函数并使用工厂模式(例如,静态newInstance()方法),其中数据通过setArguments()方法提供给片段。这附加了Bundle,可以通过getArguments()由片段实例检索。 Bundle自动成为已保存实例状态的一部分,该状态将通过上述任一事件保留。

TL; DR:其他公共建设者代表了Lint现在对你大喊的足够强大的“代码气味”