相信查看这篇文章的Android开发者,一定查找过了很多其他的答案。但是这里发现的问题属于失误性的问题,却也能导致这样错误,好了,废话不多说,直接进入正题:
bug出现的原因:
在我这个项目中的需求大概就是有一个FragmentA依赖于一个Activity B,FragmentA通过getActivity().startActivityForResult(intent, REQUEST_CODE);跳转到ActivityC并获得返回值,返回给FragmentA。A拿到这个值,然后设置给需要的TextView。但是由于原先采用的方法是ActivityB 为Fragment绑定tag是采用FragmentTransaction transaction = fm.beginTransaction(); transaction.add(Fragment arg0,String tag);对fragment绑定标识,然后通过在ActivityB调用onActivityResult方法,通过Fragment管理器Fragment f = fragmentManager.findFragmentByTag(tag):f.onActivityResult(requestCode, resultCode, data);将数据返回到对应的fragment中,但是这样的方法就会和绑定到viewpager适配器FragmentPagerAdapter的数据源List<Fragment> mDatas冲突了,相当于是绑定了两次同一个fragement(个人理解。)所以报了IllegalStateException异常。
解决办法:
不需要绑定fragment的tag,通过系统自动获取就可以了,
核心代码: Fragment f = fragmentManager.findFragmentByTag("android:switcher:" + R.id.mViewpager+ ":"+ mViewPager.getCurrentItem());
android:switcher:" + R.id.mViewpager+ ":"+ mViewPager.getCurrentItem() 这个参数能使系统通过自动查找viewpager中fragment的系统唯一tag。通过这个tag将数据返回到调用getActivity().startActivityForResult(intent, REQUEST_CODE)的fragment。因此,问题得以解决。
顺便记录一下常见的viewpager+fragment报异常:IllegalStateException:Can't change tag of fragment的原因及解决方法,
http://www.yrom.net/blog/2013/07/17/viewpager-cant-change-tag-of-fragment/ 这篇文章的作者总结得很好,报异常的主要原因是getItem的时候,没有判断list里面是否有即将记载进去的那个fragment,所以,在getItem的时候判断一下就可以了,核心代码如下:
public Fragment getItem(int position) {
// Fragment page = null;
// if (mDatas.size() > position) {
// page = mDatas.get(position);
// if (page != null) {
// return page;
// }
// }
// while (position>=mDatas.size()) {
// mDatas.add(null);
// }
}