我有一个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提供的。
答案 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()
方法,而不是自行处理。别管那种方法,您应该会很好。