返回应用程序

问题描述

我正在使用ViewPager2以及TabLayoutTabLayoutMediator显示一些片段。 我离开应用程序时遇到问题(例如通过点击主屏幕按钮),然后再次打开它,TabLayout跳到其他一些标签页。仍会选择正确的选项卡,即用户离开应用程序时使用的最后一个选项卡,并且仍显示正确的片段。出于某些原因,只是标签布局会滚动到不相关的位置。

可能是什么问题?

这是我的代码

@Override
public void onViewCreated(@NonNull View view,@Nullable Bundle savedInstanceState) {
    super.onViewCreated(view,savedInstanceState);
    mviewmodel = new viewmodelProvider(this).get(UserItemsviewmodel.class);

    viewPager = view.findViewById(R.id.view_pager);
    tabLayout = view.findViewById(R.id.tab_layout);

    viewPager.setAdapter(new ItemListFragmentAdapter(requireActivity(),mType));
    tabLayoutMediator = new TabLayoutMediator(tabLayout,viewPager,(tab,position) -> {
                if (position == 0) {
                    tab.setText("All");
                } else {
                    tab.setText(((ItemListFragmentAdapter) viewPager.getAdapter()).getItemAt(position - 1).getName());
                }
            }
    );

    mviewmodel.getFormatsLD().observe(getViewLifecycleOwner(),new Observer<List<FormatItem>>() {
        @Override
        public void onChanged(List<FormatItem> formatItems) {
            ItemListFragmentAdapter adapter = (ItemListFragmentAdapter) viewPager.getAdapter();
            if (adapter != null) {
                ((ItemListFragmentAdapter) viewPager.getAdapter()).setItems(formatItems);
                adapter.notifyDataSetChanged();

            }
        }
    });
}

@Override
public void onResume() {
    super.onResume();
    tabLayoutMediator.attach();
    viewPager.setCurrentItem(currentPage,false);


}

@Override
public void onPause() {
    super.onPause();
    currentPage = viewPager.getCurrentItem();
    tabLayoutMediator.detach();
}

currentPage是父片段中的字段,其中包含ViewPager2TabLayout,用于保留该片段暂停时用户所在的最后一个标签页/页面。 / p>

您可以在下面的这些照片中看到离开应用之前和返回应用后的外观:

enter image description here

enter image description here

解决方法

从暂停中删除.detach().attach(),然后将.attach()移至onCreateView()

@Override
public void onResume() {
    super.onResume();
    viewPager.setCurrentItem(currentPage,false);
}

@Override
public void onPause() {
    super.onPause();
    currentPage = viewPager.getCurrentItem();
}

这不是必需的,因为垃圾收集是自动进行的,但它被视为最佳实践

@Override
public void onDestroy() {
    super.onDestroy();
    tabLayoutMediator.detach();
}