ViewPager + Fragment 获取Tag

ViewPager + Fragment 获取Tag

当Activity被杀死后重新启动,当Activity由于一些原因(内存不足,横竖屏等)被重新启动时,为ViewPager添加Fragment时不应该直接new出一个新的Fragment,而是先询问FragmentManager有没有这个Fragment,不然的话会启动两个一样的Fragment,一个是你自己new的,而另外一个是FragmentManager中原先缓存的。
解决办法是用findFragmentByTag()来查找缓存中有没有这个Fragment,但是在ViewPager中添加的Fragment的Tag是多少呢,我们并没有自己给其设置Tag啊,这个就需要查看FragmentPagerAdapter中添加一个Item的源码了。不废话,上源码

    @Override
    public Object instantiateItem(ViewGroup container, int position) {
1       if (mCurTransaction == null) {
2            mCurTransaction = mFragmentManager.beginTransaction();
3        }
4
5        final long itemId = getItemId(position);
6
7        // Do we already have this fragment?
8        String name = makeFragmentName(container.getId(), itemId);
9        Fragment fragment = mFragmentManager.findFragmentByTag(name);
10        if (fragment != null) {
11            if (DEBUG) Log.v(TAG, "Attaching item #" + itemId + ": f=" + fragment);
12            mCurTransaction.attach(fragment);
13        } else {
14            fragment = getItem(position);
15            if (DEBUG) Log.v(TAG, "Adding item #" + itemId + ": f=" + fragment);
16            mCurTransaction.add(container.getId(), fragment,
17                    makeFragmentName(container.getId(), itemId));
18        }
19        if (fragment != mCurrentPrimaryItem) {
20            fragment.setMenuVisibility(false);
21            fragment.setUserVisibleHint(false);
22        }
23
24        return fragment;
    }

看一下5-9行,最关键在第8行makeFragmentName(container.getId(), itemId)方法,第一个参数为viewpager的id,第二个参数为fragment在viewpager中的id,通过第5行可知是通过getItemId(position)来获取的。
那么接下来我们看看makeFragmentName(container.getId(), itemId)方法的实现:

    private static String makeFragmentName(int viewId, long id) {
        return "android:switcher:" + viewId + ":" + id;
    }

很简单就是返回一个固定字符串加viewId的值和id的值。
那么说了这么多,我们该如何在Activity重新启动时用Tag来防止同个Fragment被加载两次呢。

方法一
  • 1 重写instantiateItem()方法:
    @Override
    public Object instantiateItem(ViewGroup container, int position) {
        Fragment fragment = (Fragment) super.instantiateItem(container, position);
        String tag = fragment.getTag();
        if (!mTags.contains(tag)) {
            mTags.add(tag);
        }
        return fragment;
    }

就是通过super.instantiateItem()获取到Fragment,然后获取其Tag。

  • 2 在onSaveInstanceState()中用Bundle保存Tag。

  • 3 在onCreate()中用Bundle恢复出Tag,然后用findFragmentByTag()方法判断是不是已经有该Fragment了,若有就不用在new一个了。

方法二
  • 1 记得makeFragmentName()方法吧,直接用“android:switcher:” + viewId + “:” + id做Tag来查找,viewId就是ViewPager的Id,id就是0,1,2这样的位置信息。

就这样简单做一个小结方便以后查找回看。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值