Ric*_*ral 13 android constructor android-dialogfragment
综观文件中DialogFragment,人们看到的静态newInstance方法来初始化一个新的警告对话框片段.我的问题是,为什么不使用构造函数来这样做,像这样:
public MyAlertDialogFragment(int title) {
Bundle args = new Bundle();
args.putInt("title", title);
setArguments(args);
}
Run Code Online (Sandbox Code Playgroud)
这不完全相同,还是以某种方式不同?什么是最好的方法,为什么?
GaR*_*eTa 23
如果您创建一个通过构造函数接收对象的DialogFragment,那么当android 重新创建您的片段时,您将遇到问题.这将是会发生的事情:
为避免这种情况,您不必依赖构造函数来建立依赖关系,而是在Bundles(参数和已保存的实例)中.这可能会迫使你在某些类中实现Parcelable,这很糟糕.
编辑:您可以通过在开发设置中启用"不维护活动"来重现Android杀死应用程序(步骤4).这是轻松测试它的方法.
ant*_*nyt 19
Android依赖于具有公共零参数构造函数的Fragment,以便它可以在不同时间重新创建它(例如配置更改,在以前被Android杀死之后恢复应用程序状态等).
如果你没有这样的构造函数(例如问题中的那个),当你试图实例化一个时,你会看到这个错误:
Fragment$InstantiationException: Unable to instantiate fragment
make sure class name exists, is public, and has an empty constructor that is public
Run Code Online (Sandbox Code Playgroud)
给予它的参数Fragment.setArguments(Bundle)将为您保存并提供给(重新)创建的任何新实例.使用静态方法创建Fragment只是提供了一种简单的方法来设置所需的参数,同时保持零参数构造函数.
Gun*_*son 11
如果你用构造函数重载MyAlertDialogFragment(int title),MyAlertDialogFragment()那么如果Fragment需要重新创建并且不传递参数,Android系统仍然可以调用默认构造函数.