ViewPager + Fragment 获取Tag
2016-05-19 21:22
309 查看
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这样的位置信息。
就这样简单做一个小结方便以后查找回看。
相关文章推荐
- Android Fragment 基本了解(图文介绍)
- Android程序开发之Fragment实现底部导航栏实例代码
- Android应用开发中Fragment与Activity间通信示例讲解
- Android的Fragment的生命周期各状态和回调函数使用
- 浅谈Android App开发中Fragment的创建与生命周期
- 实例探究Android开发中Fragment状态的保存与恢复方法
- Android Fragment的使用方法(翻译)
- 实例探究Android应用编写时Fragment的生命周期问题
- Android App开发中创建Fragment组件的教程
- Android中的Fragment类使用进阶
- 使用Fragment来处理Andoird app的UI布局的实例分享
- Android App中使用ListFragment的实例教程
- Android中Fragment子类及其PreferenceFragment的创建过程演示
- Android应用开发中Fragment间通信的实现教程
- Android 中 Fragment的使用大全
- Android基于ViewPager Fragment实现选项卡
- Android中Fragment与Activity的生命周期对比
- 实例讲解Android应用开发中Fragment生命周期的控制
- Android学习之Fragment
- Android中Fragment的生命周期与返回栈的管理