我正在使用ViewPager2
以及Tablayout
和TablayoutMediator
来显示一些片段。当我离开应用程序(例如点击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
是父片段中的一个字段,它承载ViewPager2
和TabLayout
,用于保留片段暂停时用户所在的最后一个选项卡/页面。
你可以在下面的这些照片中看到它在离开app之前和回到app之后的样子:
暂停时删除.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();
}