我继承了这个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;
    }

   ...

}


错误指向第二种方法和第三种方法,分别是public BasicInfoFragment(User user)public BasicInfoFragment(User user, Templates templates),所以我很困惑为什么public BasicInfoFragment()可以,但是其他两个都不可以?

最佳答案

我感到困惑,为什么public BasicInfoFragment()可以,但是其他两个都不可以?


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

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

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

TL; DR:其他公共构造函数代表一种足够强烈的“代码气味”,如今Lint会对您大喊大叫

10-07 19:25
查看更多