问题描述
我正在使用ViewPager2
以及TabLayout
和TabLayoutMediator
来显示一些片段。
我离开应用程序时遇到问题(例如通过点击主屏幕按钮),然后再次打开它,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
,用于保留该片段暂停时用户所在的最后一个标签页/页面。 / p>
您可以在下面的这些照片中看到离开应用之前和返回应用后的外观:
解决方法
从暂停中删除.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();
}