android-fragments viewpager2中的片段丢失

r1zk6ea1  于 2022-11-14  发布在  Android
关注(0)|答案(2)|浏览(205)

当我在不同的片段中选择日历视图上的月份时,或者当我旋转屏幕时,我丢失了“保留”片段。但当我开始滑动时,所有片段又正常工作了。我想这与我的应用程序的生命周期有关,但我很难找到解决这个问题的方法。
我也在用

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

在我的许多fest保持我的按钮的状态在我的碎片之一。
我错过了什么?

brc7rcf0

brc7rcf01#

你可以在android中使用savedInstanceStateviewModel(我建议第一个)。所以,viewPager有ViewPager.onPageChangeListener(参考SO答案https://stackoverflow.com/a/11294494/12649627)。所以,本质上你的活动或片段应该看起来像这样
Java溶液:

public class MyFragment extends Fragment {
    private int pagerPosition = 0;
    private final static String PAGER_POSITION_TAG = "PAGER_POSITION_TAG";
    private ViewPager2 myViewPager;
    private ViewPager2.OnPageChangeCallback callback = new ViewPager2.OnPageChangeCallback() {
        @Override
        public void onPageSelected(int position) {
            super.onPageSelected(position);
            pagerPosition = position;
        }
    }

    @Nullable
    @Override
    public View onCreateView(@NonNull LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) {
        if (savedInstanceState != null) {
            pagerPosition = savedInstanceState.getInt(PAGER_POSITION_TAG, 0);
        }
        return inflater.inflate(R.layout.my_fragment, container, false);
    }

    @Override
    public void onViewCreated(@NonNull View view, @Nullable Bundle savedInstanceState) {
        super.onViewCreated(view, savedInstanceState);
        myViewPager = view.findViewById(R.id.my_view_pager);
        myViewPager.setCurrentItem(pagerPosition);
        myViewPager.registerOnPageChangeCallback(callback);
    }

    @Override
    public void onSaveInstanceState(@NonNull Bundle outState) {
        super.onSaveInstanceState(outState);
        outState.putInt(PAGER_POSITION_TAG, pagerPosition);
    }

    @Override
    public void onDestroy() {
        super.onDestroy();
        myViewPager.unregisterOnPageChangeCallback(callback);
    }
}

P.S.:我发现有一个叫做registerOnPageChangeCallbackunregisterOnPageChangeCallback的东西。所以我用了它们。忽略上面的代码。

flvtvl50

flvtvl502#

最后这:

binding.activityMainViewpager.setOffscreenPageLimit(2);

我已经解决了剩下的问题^^'

相关问题