Fragment的工厂方法:设置类变量与将Bundle作为参数放入片段
问题描述:
我一直在阅读有关使用工厂方法来获取自定义Fragment
类的对象的信息。让说,我有一个自定义Fragment
类,如下所示:Fragment的工厂方法:设置类变量与将Bundle作为参数放入片段
public class CustomFragment extends Fragment {
..........
public static CustomFragment getInstance(String message) {
CustomFragment fragment = new CustomFragment();
Bundle bundle = new Bundle();
bundle.putString(MESSAGE, message);
fragment.setArguments(bundle);
return fragment;
}
..............
}
如果我有一个名为消息类变量,我使用类似的实例化对象的setter将其值设置:
public class CustomFragment extends Fragment {
..........
private String MESSAGE;
private void setMessage(String msg) {
this.MESSAGE = msg;
}
public static CustomFragment getInstance(String message) {
CustomFragment fragment = new CustomFragment();
fragment.setMessage(message);
return fragment;
}
..............
}
哪上面两个是首选,为什么?
答
使上述2个是优选的
第一个。
为什么?
用户将旋转屏幕或以其他方式触发您的应用程序进行配置更改。您的前台活动及其片段将被销毁并在默认情况下重新创建。在第一种情况下,该消息将成为已保存实例状态Bundle
的一部分,并且不会丢失。在第二种情况下,消息将会丢失,除非您在某处添加了额外的代码以专门保存它。
我的类级别变量'MESSAGE'是否也是已保存实例状态的一部分,因为它是整个被放入保存状态的'CustomFragment'类对象? – Swapnil
@Swapnil:“我的类级别变量'MESSAGE'是否也是已保存实例状态的一部分” - 否。 “这是整个CustomFragment类对象是否处于保存状态?” - 这是不可能的。保存的Fragment实例状态是一个Bundle,传递给onSaveInstanceState()。 “片段”保存的实例状态不是“片段”本身。 – CommonsWare