Android:进入多窗口模式时,Fragment的字段会被清除

时间:2018-09-11 19:48:32

标签: android android-fragments android-viewpager

我有一个ViewPager中使用的片段。片段实例是通过工厂方法构造的,如下所示:

public static MyFragment newInstance(int sectionNumber, List<String> aList) {
    MyFragment fragment = new MyFragment();
    fragment.list = aList;
    return fragment;
}

该列表从活动的onCreate()方法传递到SectionsPagerAdapter实例,在该实例中我为片段调用newInstance()。列表永远不能为空(代码中包含检查项)。

问题:当我尝试输入时,应用程序无法通过onStart()方法使用NPE Multi-Window view。该列表为空。

我注意到,我在newInstance()调用中设置的字段现在为空。只有在onCreateView()中初始化的对象才分配有对象。我猜想系统会绕过newInstance()方法以不同的方式初始化Fragment。

问题:为什么将在我的工厂方法中设置的字段设置为null?为什么仅在多窗口模式下发生?如何预防呢?

可能我滥用了某些东西,以为默认情况下,通过工厂方法创建片段是Astroid Studio提供的。

2 个答案:

答案 0 :(得分:2)

由于这个确切的问题,您永远不要在片段中设置数据。

当您的应用进入多窗口模式时,您的片段/活动将重新创建,因此您传递的所有数据都将丢失。

您应该做的是处理配置更改的操作,是将bundle中的数据通过setArguments传递给片段。加载片段后,您将通过bundle获得getArguments,然后从分发包中获取信息并照常进行。

get / setArguments通过更改配置保存捆绑软件信息

它看起来像这样

myFragment =  new MyFragment();
Bundle b = new Bundle();
b.putLong("list",aList);
myFragment.setArguments(b);

答案 1 :(得分:1)

多窗口是配置更改的一种形式。我敢打赌,如果您旋转设备,将会出现同样的问题。

在“活动”的AndroidManifest块中,尝试添加以下内容(作为<activity>的属性:

android:configChanges="keyboard|screenLayout|screenSize|orientation"

这将告诉Android您要自己处理Configuration更改,并调用Activity的(和Fragment的)onConfigurationChanged()方法,而不是自行处理。别管那种方法,您应该会很好。