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 studio 连接数据库小经历遇到的问题以及解决方法(java.sq
  2. android 永远锁屏解决方法
  3. android软键盘把页面挤上去的解决方法
  4. 解决EditText不显示光标的三种方法(总结)
  5. JS判断Android、iOS或浏览器的多种方法(四种方法)
  6. Android View onMeasure 方法
  7. Android Studio 3.0以后打包修改文件名方法

随机推荐

  1. Android问题集(七)——TableLayout 中让Tab
  2. Android实现朋友圈多图显示功能
  3. AndroidManifest.xml - 【 manifest -> a
  4. 补间动画--缩放动画XML
  5. Android系统框架概述
  6. Android打开activity的时候,设置editText
  7. 鉴客 Android中如何生成带圆角的Bitmap图
  8. 安卓控件属性
  9. Android EditText的设置以及软键盘的各种
  10. Android中TextView限制行数及末尾已省略