我继承了这款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()
可以,但其他两种方法没有?
答案 0 :(得分:5)
我很困惑为什么公共的BasicInfoFragment()没问题,但其他两个不是?
当活动被破坏并作为配置更改(例如,屏幕旋转)的一部分重新创建时,Android会自动销毁并重新创建由旧活动实例管理的片段。为此,它将使用默认构造函数,而不是其他两个构造函数。
此外,当您在后台终止您的应用程序进程,并且用户返回您的应用程序(例如,最近任务列表)时,Android将创建一个全新的活动实例...并且所有它的碎片。再一次,它将使用默认构造函数。
使用其他构造函数的风险是,在上述任何一个事件中,传入这些构造函数的任何对象都容易丢失。 Lint指导您摆脱那些构造函数并使用工厂模式(例如,静态newInstance()
方法),其中数据通过setArguments()
方法提供给片段。这附加了Bundle
,可以通过getArguments()
由片段实例检索。 Bundle
自动成为已保存实例状态的一部分,该状态将通过上述任一事件保留。
TL; DR:其他公共建设者代表了Lint现在对你大喊的足够强大的“代码气味”