【问题标题】:Android: Fragment's fields get cleared while entering Multi-Window modeAndroid:进入多窗口模式时,片段的字段被清除
【发布时间】:2018-09-11 19:48:31
【问题描述】:

我有一个在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。

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

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

【问题讨论】:

    标签: android android-fragments android-viewpager


    【解决方案1】:

    你不应该因为这个确切的问题而在你的片段中设置数据。

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

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

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

    它看起来像这样

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

    【讨论】:

    • 谢谢。这是否意味着我的片段可能以不同的方式实例化(绕过newInstance() 调用)?如果它是通过活动的onCreate 方法构造的,则字段永远不会为空。
    • 不确定您的意思,片段仅以一种方式创建。创建片段对象不是创建片段。将片段添加到片段管理器时会创建片段
    【解决方案2】:

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

    在您的 Activity 的 AndroidManifest 块中,尝试添加以下内容(作为 &lt;activity&gt; 的属性:

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

    这将告诉 Android 您想要自己处理配置更改,并将调用您的 Activity(和 Fragment)的onConfigurationChanged() 方法而不是自己处理。不用管那个方法,你应该很好。

    【讨论】:

    • 谢谢。您能否详细说明为什么会发生这种情况?为什么它不以它应该实例化的方式实例化我的 Fragment?我也没有找到任何可以证明系统可能会清除某些字段或以不同方式实例化我的类的文档。解决问题非常困难——到目前为止,我只是通过android:resizeableActivity="false" 关闭了多窗口模式。
    • @OleksandrShpota 基本上,你做错了。请参阅 tyczj 的答案。您可以在 Bundle 中传递 ArrayList&lt;String&gt;,因此您应该可以使用正确的方法。
    猜你喜欢
    • 1970-01-01
    • 2014-05-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-03-17
    • 1970-01-01
    相关资源
    最近更新 更多