提问者:小点点

碎片方向变化数据丢失


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

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;
    }

}

在Fragments中,当用户改变方向时,我丢失了所有数据,Fragments再次创建。 我在Fragment的onCreate方法中添加了setRetainInstance(true);,并将Android:configChanges=“OrientationScreenSizeKeyboardHidden”设置到manifest中的activity行。 但我的问题还是发生了。

你能帮我吗?


共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
}

匿名用户

更改设备的方向被视为配置更改。

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

解决此问题的建议方法是使用ViewModel。 ViewModel的思想是,它在这些配置更改中幸存下来,并且当您的片段被重新创建时,它将仅仅重新连接到ViewModel。

或者,您可以自己处理配置更改。 谷歌并不推荐这种选择,而是作为最后的手段使用。