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被拥有FragmentActivity所改变。

如果你想在你的活动中得到正确的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 } }