我的背景
假设我有一个Fragment
,其中包含一个ViewPager
,其中有3个页面( fragment )。我的 onCreateView 方法:
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
Bundle savedInstanceState) {
View rootView = inflater.inflate(R.layout.main_tv_fragment, null);
listFragment = new ArrayList<>();
listFragment.add(new EventFragment());
listFragment.add(new ChannelFragment());
listFragment.add(new FavoriteFragment());
viewPager = (ViewPager) rootView.findViewById(R.id.viewpager);
fragmentPagerAdapter = new MainLiveTVtAdapter(
getChildFragmentManager(), listFragment);
slidingTabLayout = (SlidingTabLayout) rootView.findViewById(R.id.sliding_tabs);
// Center the tabs in the layout
slidingTabLayout.setDistributeEvenly(true);
slidingTabLayout.setCustomTabColorizer(null);
try {
viewPager.setAdapter(fragmentPagerAdapter);
} catch (Exception ex) {
ex.getMessage();
}
slidingTabLayout.setCustomTabColorizer(new SlidingTabLayout.TabColorizer() {
@Override
public int getIndicatorColor(int position) {
return getActivity().getResources().getColor(R.color.action_bar_bg);
}
});
slidingTabLayout.setViewPager(viewPager);
viewPager.setOffscreenPageLimit(5);
viewPager.setAdapter(fragmentPagerAdapter);
slidingTabLayout.setViewPager(viewPager);
viewPager.setCurrentItem(page, false);
return rootView;
}
我调用了viewPager.setCurrentItem(page, false);
来设置ViewPager
的当前页面,假设page = 1
表示第二个页。当 fragment 在窗口中呈现时,会显示第二页,我将 ViewPager 滚动到第三页,然后用另一个 fragment 替换该 fragment 。之后,我重新创建此 fragment 并将其打开,但即使使用 page 调用
。viewPager.setCurrentItem(page, false);
,ViewPager
仍然显示第三页= 1
如上所示,ViewPager
已创建新实例,Adapter
也已创建。
任何人都可以解释为什么会发生这种情况吗?我该如何解决它?
编辑
这是我的 ViewPager
的 Adapter
public class MainLiveTVtAdapter extends FragmentStatePagerAdapter {
private List<Fragment> fragments;
private String[] title = {"Sự kiện", "Kênh","Yêu thích"};
FragmentManager fm;
public MainLiveTVtAdapter(FragmentManager fm, List<Fragment> fragments) {
super(fm);
this.fm=fm;
this.fragments = fragments;
}
@Override
public Fragment getItem(int position) {
return this.fragments.get(position);
}
@Override
public int getItemPosition(Object object) {
return POSITION_NONE;
}
@Override
public int getCount() {
return this.fragments.size();
}
@Override
public CharSequence getPageTitle(int position) {
return title[position];
}
// @Override
// public void destroyItem(ViewGroup container, int position, Object object) {
// if (position >= getCount()) fm.beginTransaction().remove((Fragment) object).commit();
// }
}
最佳答案
这就是平台的设计方式。当重新创建 Activity/fragment 时,它会尝试保留具有 id 的 View 状态。 ViewPager 的位置与 EditText 的内容保持相同。 如果你想摆脱这个 - 有几种方法:
- 重写 onSaveInstanceState 并使用您选择的索引调用 viewPager.setCurrentItem(),
- 重写 onSaveInstanceState 并调用 viewPager.setAdapter(null),
- 覆盖 onRestoreInstanceState 并使用您选择的索引调用 viewPager.setCurrentItem()
可能还有其他方法,但通常开发人员都可以使用保留状态的默认行为。
请注意,如果 fragment/Activity 是新添加且未重新创建的(savedInstanceState 等于 null),则当前项将是您在 onCreate 中设置的项。
关于android - 为什么即使创建了新实例,ViewPager 仍保留其当前页面?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29305012/