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