Android里,Fragment和Activity具有startActivityForResult() 方法,但在支持库里,二者的表现却会有很大差异。
假定目前使用的是Android支持库(Support library),我们在Fragment里,调用 startActivityForResult(intent, 0); 然后在对应的Activity里override onActivityResult()方法,我们会惊奇地发现,requestCode == 65536 (0x10000).
与此同时,如果我们在Fragment里重写(override) onActivityResult() 方法,则会得到正确的0。



察看Android的源码,可以在支持库里的FragmentActivity找到这么一个函数:
public void startActivityFromFragment(Fragment fragment, Intent intent,         int requestCode) {    if (requestCode == -1) {        super.startActivityForResult(intent, -1);        return;    }    if ((requestCode&0xffff0000) != 0) {        throw new IllegalArgumentException("Can only use lower 16 bits for requestCode");    }    super.startActivityForResult(intent, ((fragment.mIndex+1)<<16) + (requestCode&0xffff));}


这里我们可以看到,在Activity里调用时,requestCode 变成了 ((fragment. mIndex + 1 )<< 16 ) + (requestCode& 0xffff ),对比上例,fragment.mIndex 应该就是0,结果呢,requestCode 增加了65536。


再看看FragmentActivity中的 onActivityResult()
@Overrideprotected void onActivityResult(int requestCode, int resultCode, Intent data) {    mFragments.noteStateNotSaved();    int index = requestCode>>16;    if (index != 0) {        index--;        if (mFragments.mActive == null || index < 0 || index >= mFragments.mActive.size()) {            Log.w(TAG, "Activity result fragment index out of range: 0x"  + Integer.toHexString(requestCode));            return;        }        Fragment frag = mFragments.mActive.get(index);        if (frag == null) {            Log.w(TAG, "Activity result no fragment exists for index: 0x"  + Integer.toHexString(requestCode));        } else {            frag.onActivityResult(requestCode&0xffff, resultCode, data);        }        return;    }        super.onActivityResult(requestCode, resultCode, data);}

这里,根据requestCode,会将返回的数据转发给对应的Fragment




解决办法:在Fragment调用startActivityForResult(),则在该Fragment中重写onActivityResult()。 note: 同一Activity的其他Fragment也不行。



更多相关文章

  1. 详解 Android(安卓)的 Activity 组件
  2. Android(安卓)支持多屏幕机制
  3. 详解 Android(安卓)的 Activity 组件
  4. Linux Kernel and Android休眠与唤醒
  5. Android中三星调用系统相机拍照后旋转的问题
  6. Android中通过Intent 调用图片、视频、音频、录音、拍照
  7. android 存储联系人(save contact) 总结
  8. Android(安卓)源码分析-打电话和发短信
  9. cocos2d-x3.0beta版+NDK-r9b在android上的启动过程

随机推荐

  1. AnDroidDraw.apk的安装
  2. Android高手进阶教程(二十二)之---Androi
  3. Android常用布局及属性--LinearLayout
  4. 如何获取android源代码
  5. 【Android(安卓)Training UI】创建自定义
  6. ScrollView常用属性汇总
  7. android 3.0中加快启动模拟器
  8. Android中Bitmap和Drawable
  9. Android应用实例之----基于Service与Cont
  10. Android(安卓)Java汉字转拼音总结