返回应用程序后,TabLayout 中的选定选项卡未显示在屏幕上

Selected tab in TabLayout is not shown on screen after returning to app

我正在使用 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 的父片段中的一个字段,用于保留片段时用户所在的最后一个 tab/page暂停了。

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

从暂停中删除 .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();
}