java.lang.IllegalStateException: Can't change tag of fragment xxxFragment
来源:互联网 发布:北外网络教育 编辑:程序博客网 时间:2024/05/29 18:43
在应用里用到了 ViewPager 和 FragmentPagerAdapter 实现多页滑动,每一页都是一个Fragment。
当需要对某个Fragment进行操作时,就要获取到这个Fragment(Fragment之间通信有几种方式,在这直说Tag),但是并没有去设置Tag。当我们通过getFragmentManager().beginTransaction().add(xxxFragment, "tag")方式去添加的时候会出现异常:
java.lang.IllegalStateException: Can't change tag of fragment OrderJXZFragment{412af788 #4 OrderJXZFragment}: was OrderJXZFragment now android:switcher:2131231294:1
该非法异常是说我们不能去修改Fragment的Tag,因为已经设置了。那我们什么时候设置过呢,当然是通过FragmentPagerAdapter 进行设置的,下面我们看看源码:
@Overridepublic 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;}看一下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的值。
下面就是获取Tag的方法:
重写MyFragmentPagerAdapter的instantiateItem方法(最好的方式,Fragment在viewpager中初始化时都已经获取到了Tag,不影响其他地方根据tag获取Fragment):
@Overridepublic Object instantiateItem(ViewGroup container, int position) {// TODO Auto-generated method stub//return super.instantiateItem(container, position);Fragment fragment = (Fragment) super.instantiateItem(container, position);if(fragment instanceof xxxFragment){mTags = fragment.getTag();Log.e("MyFragmentPagerAdapter instantiateItem", mTags);} return fragment;}从打印的信息就可以看到Tag的格式,通过该Tag就可以在其他地方来获取要操作的Fragment进行操作。
打印信息:
11-10 14:26:24.269: E/MyFragmentPagerAdapter instantiateItem(26912): android:switcher:2131231294:1通过Tag获取Fragment:
FragmentManager fm = getFragmentManager(); xxxFragment of = (xxxFragment ) fm.findFragmentByTag(mTags);
0 0
- java.lang.IllegalStateException: Can't change tag of fragment xxxFragment
- java.lang.IllegalStateException: Can't change tag of fragment
- android studio报:java.lang.IllegalStateException: Can't change tag of fragment
- Android 中ViewPager+fragment报异常:IllegalStateException:Can't change tag of fragment的一种解决思路
- Android—ViewPager: Can't Change Tag of Fragment
- 遇到一个问题 : Can't change tag of fragment CoverFragment
- Android Fragment异常:java.lang.IllegalStateException: Fragment XXXFragment not attached to Activity
- Android报错ViewPager: Can't Change Tag of Fragment的解决方法
- java.lang.IllegalStateException:Fragment XXXFragment{409864b0} not attached to Activity
- java.lang.IllegalStateException: The maximum number of cell styles was exceeded. You can define up t
- xfire webservice异常 java.lang.IllegalStateException: Can't overwrite cause
- Java Mail发送邮件java.lang.IllegalStateException: Can't overwrite cause错误
- android学习笔记:AndroidRuntime: java.lang.IllegalStateException: The content of the adapter has change
- Fragment解决java.lang.IllegalStateException: Can not perform this action after onSaveInstanceState
- Fragment java.lang.IllegalStateException: Can not perform this action after onSaveInstanceState
- Fragment中使用出现的java.lang.IllegalStateException: Can not perform this action after onSaveInstanceState
- 解决Fragment偶发异常java.lang.IllegalStateException: Can not perform this action after onSaveInstanceState
- 解决Fragment偶发异常java.lang.IllegalStateException: Can not perform this action after onSaveInstanceState
- 关于The import android.support.v7.app cannot be resolved
- Spark生态之Alluxio学习11--alluxio-1.3.0集群配置
- POJ 3007
- linux ftp命令
- poj 1703 Find them, Catch them
- java.lang.IllegalStateException: Can't change tag of fragment xxxFragment
- 关于flask中Role的解释
- php 二位数组排序方式
- Linux下gcc宏定义作用域
- Spark生态之Alluxio学习12--spark调用alluxio-1.3.0配置
- hduoj 2084
- ESAPI处理sql注入和xss攻击
- HarborRegistry——centos上使用docker-compose源码安装Harbor
- destoon系统 接入第三方短信平台