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的一部分,并且不会丢失。在第二种情况下,消息将会丢失,除非您在某处添加了额外的代码以专门保存它。

+0

我的类级别变量'MESSAGE'是否也是已保存实例状态的一部分,因为它是整个被放入保存状态的'CustomFragment'类对象? – Swapnil

+1

@Swapnil:“我的类级别变量'MESSAGE'是否也是已保存实例状态的一部分” - 否。 “这是整个CustomFragment类对象是否处于保存状态?” - 这是不可能的。保存的Fragment实例状态是一个Bundle,传递给onSaveInstanceState()。 “片段”保存的实例状态不是“片段”本身。 – CommonsWare