android - 为什么即使创建了新实例,ViewPager 仍保留其当前页面?

标签 android android-fragments android-viewpager

我的背景

假设我有一个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 也已创建。

任何人都可以解释为什么会发生这种情况吗?我该如何解决它?

编辑

这是我的 ViewPagerAdapter

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/

相关文章:

android - Eclipse 没有检测到我的 Android 设备

android - 在电子邮件 Intent 将您带到电子邮件客户端后返回应用程序

java - 如何保存和重用相同的 fragment 实例?

android - PageAdapter.Instantiate 新项目的时机

java - mViewPager.getCurrentItem() 没有返回第一个和最后一个寻呼机的正确位置

android - 如何在框架布局中实例化 View ?

java - Android 2.1 native 锁定位图像素

android - 在 Android 中搜索 ListView 项目,总是打开 ListView 的第一个项目

java - 使用 Dagger 2 在 Fragment 中注入(inject)依赖项时出错

android - 如何在 android 中保存和恢复 FragmentPagerAdapter 状态?