Android Pitfall - Fragment.startActivityForResult(), requestCode == 65536
16lz
2021-01-23
Android里,Fragment和Activity具有startActivityForResult() 方法,但在支持库里,二者的表现却会有很大差异。
假定目前使用的是Android支持库(Support library),我们在Fragment里,调用 startActivityForResult(intent, 0); 然后在对应的Activity里override onActivityResult()方法,我们会惊奇地发现,requestCode == 65536 (0x10000).
与此同时,如果我们在Fragment里重写(override) onActivityResult() 方法,则会得到正确的0。
察看Android的源码,可以在支持库里的FragmentActivity找到这么一个函数:
这里我们可以看到,在Activity里调用时,requestCode 变成了 ((fragment. mIndex + 1 )<< 16 ) + (requestCode& 0xffff ),对比上例,fragment.mIndex 应该就是0,结果呢,requestCode 增加了65536。
再看看FragmentActivity中的 onActivityResult()
这里,根据requestCode,会将返回的数据转发给对应的Fragment
解决办法:在Fragment调用startActivityForResult(),则在该Fragment中重写onActivityResult()。 note: 同一Activity的其他Fragment也不行。
假定目前使用的是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也不行。
更多相关文章
- Android studio 连接数据库小经历遇到的问题以及解决方法(java.sq
- android 永远锁屏解决方法
- android软键盘把页面挤上去的解决方法
- 解决EditText不显示光标的三种方法(总结)
- JS判断Android、iOS或浏览器的多种方法(四种方法)
- Android View onMeasure 方法
- Android Studio 3.0以后打包修改文件名方法