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()
@Override protected 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也不行。