提问者:小点点

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


我正在使用ViewPager2以及TablayoutTablayoutMediator来显示一些片段。当我离开应用程序(例如点击home按钮),然后再次打开它时,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,用于保留片段暂停时用户所在的最后一个选项卡/页面。

你可以在下面的这些照片中看到它在离开app之前和回到app之后的样子:


共1个答案

匿名用户

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