Android Pitfall - Fragment.startActivityForResult(), requestCode == 65536

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




發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章