ViewPager + Fragment 获取Tag
来源:互联网 发布:软件板块股票行情 编辑:程序博客网 时间:2024/05/22 20:21
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 }45 final long itemId = getItemId(position);67 // 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 }2324 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这样的位置信息。
就这样简单做一个小结方便以后查找回看。
- ViewPager + Fragment 获取Tag
- 获取ViewPager中的Fragment实例 或者叫 ViewPager中Fragment的TAG
- 获取VIEWPAGER中的FRAGMENT
- ViewPager获取Fragment
- ViewPager+Fragment获取联系人列表
- ViewPager中如何获取Fragment
- ViewPager中怎么获取Fragment
- android ViewPager中获取Fragment
- 在ViewPager中获取Fragment
- Android—ViewPager: Can't Change Tag of Fragment
- Android ViewPager刷新Fragment数据(ViewPager获取Fragment对象)
- Android ViewPager刷新Fragment数据(ViewPager获取Fragment对象)
- 获取ViewPager当前展示的Fragment
- ViewPager获取当前显示的fragment
- 获取当前ViewPager里面的Fragment对象
- 获取ViewPager当前展示的Fragment
- 获取ViewPager当前展示的Fragment
- Viewpager+fragment结构,如何获取fragment中的控件
- Linux下安装VMware Tools 的方法
- 基于注解的组件扫描
- hdu2767&&hdu3836 Proving Equivalences(Tarjan+缩点)
- laravel5.1框架下实现图片上传
- Linux日常维护命令
- ViewPager + Fragment 获取Tag
- SSM小技巧(一)、Controller中互相调用session中存储的内容
- OC 对象作为方法的参数连续传递
- ZOJ 3228Searching the String
- MySQL入门--修改mysql提示符的两种方法
- 编程之美3:最大公约数问题
- 58.二叉搜索树的第k个结点
- HTTP请求方法
- 简谈多态及虚函数