onActivityResult中的错误requestCode
我从我的片段开始一个新的活动
startActivityForResult(intent, 1);
并想要处理Fragment的父Activity中的结果:
@Override protected void onActivityResult(int requestCode, int resultCode, Intent data) { Log.d(TAG, "onActivityResult, requestCode: " + requestCode + ", resultCode: " + resultCode); if (requestCode == 1) { // bla bla bla } }
问题是,我从来没有得到我刚刚发布到startActivityForResult()
的requestCode
。 我得到了像0x40001,0x20001等随机更高位集。 文件没有说这个。 有任何想法吗?
你正在从你的Fragment
调用startActivityForResult()
。 当你这样做的时候, requestCode
被拥有Fragment
的Activity
所改变。
如果你想在你的活动中得到正确的resultCode
,试试这个:
更改:
startActivityForResult(intent, 1);
至:
getActivity().startActivityForResult(intent, 1);
请求代码没有错。 使用v4支持库碎片时,碎片索引被编码在请求代码的前16位,请求代码位于后16位。 片段索引稍后用于find正确的片段来传递结果。
因此对于活动开始forms片段对象处理onActivityResult requestCode如下所示:例如,您可以解码这个requestCode,如:
originalRequestCode = changedRequestCode – (indexOfFragment << 16)6 = 196614 – (3 << 16)
如果你提供的是不断公开的,然后在startActivityResult
使用
例:
public static final int REQUEST_CODE =1; getActivity().startActivityForresult(intent, REQUEST_CODE);
你也可以定义
super.onActivityResult(requestCode, resultCode, data)
在Activity
(如果你重写onActivityResult
)在这个
@Override protected void onActivityResult(int requestCode, int resultCode, Intent data) { switch (requestCode) { ... default: super.onActivityResult(requestCode, resultCode, data); } }
并在Fragment
调用startActivityForResult(intent, requestCode)
更轻松:
int unmaskedRequestCode = requestCode & 0x0000ffff
检查较低的16位,只是揭开它做一个逻辑与高16位归零
protected void onActivityResult(int requestCode, int resultCode, Intent data) { final int unmaskedRequestCode = requestCode & 0x0000ffff if(unmaskedRequestCode == ORIGINAL_REQUEST_CODE){ //Do stuff } }