【问题标题】:Lost data on orientation change in fragment片段方向变化的丢失数据
【发布时间】:2020-06-09 22:04:11
【问题描述】:

我有一个带有多个片段的视图寻呼机,我的 viewPager 适配器是:

private class MyPagerAdapter extends FragmentStateAdapter {

    MyPagerAdapter(@NonNull FragmentManager fragmentManager, @NonNull Lifecycle lifecycle) {
        super(fragmentManager, lifecycle);
    }

    @Override
    public Fragment createFragment(int position) {
        Fragment fragment = ScreenFragment.newInstance(position);
        return fragment;
    }

    @Override
    public int getItemCount() {
        return 5;
    }

}

在 Fragment 中,当用户改变方向时,我丢失了所有数据,并且 Fragment 再次创建。我在 Fragment 的 onCreate 方法中添加了 setRetainInstance(true);,并将 android:configChanges="orientation|screenSize|keyboardHidden" 设置为清单中的 Activity 行。但是我的问题还是出现了。

你能帮帮我吗?

【问题讨论】:

    标签: android android-fragments


    【解决方案1】:

    更改设备的方向被视为configuration change

    配置更改会破坏,然后重新创建您的片段。

    解决此问题的推荐方法是使用ViewModel。 ViewModel 的想法是它可以在这些配置更改中幸存下来,并且当您的 Fragment 重新创建时,它只会重新连接到 ViewModel。

    或者,您也可以handle the configuration change yourself。 Google 不推荐此选项,并且只能作为最后的手段使用。

    【讨论】:

    • 为了使用 ViewModel,我应该使用 MVVM 架构吗?还是可以和普通编码一起使用?
    • 如果可以的话,你应该尝试使用 MVVM 架构。这样做是 android 开发的新“黄金标准”,也是 Google 自己强烈推荐的。你可以read more about it here
    • 我的项目结束了,我只有这个问题。这对我来说有点困难......
    【解决方案2】:

    您可以保存数据并在旋转后恢复它们。

    @Override
    public void onSaveInstanceState(Bundle outState, PersistableBundle outPersistentState) 
       {
        super.onSaveInstanceState(outState, outPersistentState);
    
        outState.putString("theWord", theWord); // Saving the Variable theWord
        outState.putStringArrayList("fiveDefns", fiveDefns); // Saving the ArrayList 
     fiveDefns
    }
    
    @Override
    public void onRestoreInstanceState(Bundle savedInstanceState, PersistableBundle 
    persistentState) {
        super.onRestoreInstanceState(savedInstanceState, persistentState);
    
        theWord = savedInstanceState.getString("theWord"); // Restoring theWord
        fiveDefns = savedInstanceState.getStringArrayList("fiveDefns"); //Restoring 
    fiveDefns
    }
    

    【讨论】:

    • 在我的片段中是网络视图,我无法保存网络视图数据。
    • 没有用,无法保存该数据,但您可以保存状态,以便它可以从那里开始。另一方面,您应该使用 mvvm 以便于管理。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多