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也不行。