正确使用FragmentPagerAdapter,避免Fragment重叠问题

作为一个android 开发程序员,大家都曾为Fragment重叠的问题所苦恼。目前解决方法也很多,我今天给大家介绍一个很简单的方法,不需要增加任何代码就能解决此问题。如下:

 class MyPagerAdapter extends FragmentPagerAdapter {

        public MyPagerAdapter(FragmentManager fm) {
            super(fm);
        }

        @Override
        public Fragment getItem(int position) {
            if (position == 0) {
                return new Fragment1();
            } else {
                return new Fragment2();
            }
        }

        @Override
        public int getCount() {
            return 2;
        }
    }

首先Fragment重叠是因为Activity维护了一系列的Fragment,再诸如内容重启时,Activity不保存Fragment的show,或hide状态,导致Fragment重叠。那么我们可以不让Activity维护Fragment,让FragmentViewPager自己维护。有人可能会问,难道每次调用getItem()方法都会重新创建一个Fragment吗?当然不是,下面我们来看下FragmentPagerAdapter的源码。

@Override
    public Object instantiateItem(ViewGroup container, int position) {
        if (mCurTransaction == null) {
            mCurTransaction = mFragmentManager.beginTransaction();
        }

        final long itemId = getItemId(position);

        // Do we already have this fragment?
        String name = makeFragmentName(container.getId(), itemId);
        Fragment fragment = mFragmentManager.findFragmentByTag(name);
        if (fragment != null) {
            if (DEBUG) Log.v(TAG, "Attaching item #" + itemId + ": f=" + fragment);
            mCurTransaction.attach(fragment);
        } else {
            fragment = getItem(position);
            if (DEBUG) Log.v(TAG, "Adding item #" + itemId + ": f=" + fragment);
            mCurTransaction.add(container.getId(), fragment,
                    makeFragmentName(container.getId(), itemId));
        }
        if (fragment != mCurrentPrimaryItem) {
            fragment.setMenuVisibility(false);
            fragment.setUserVisibleHint(false);
        }

        return fragment;
    }

如果FragmentManager已存在此Fragment,则重新绑定(因为在destroyItem()方法中对Fragment进行了解绑),否则才通过getItem()方法获取Fragment。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值