问题描述
在MainActivity的一个子Fragment中调用startActivityForResult(intent, 11)方法启动一个SecondActivity,并在SecondActivity的setResult(22)方法中设置回传code为22,但无法在MainActivity中的onActivityResult()方法中正确回调,于是打印参数,发现MainActivity#onActivityResult()方法中的两个参数结果分别为:
requestCode=65647;resultCode=201 与预期不符
问题代码如下:
// Fragment中的调用代码为
public class MapFragment extends Fragment {
...
private void initEvent(){
// 调用之处
Intent intent = new Intent(getActivity(), SecondActivity.class);
startActivityForResult(intent, 11); // 【问题之处】
}
...
}
// SecondActivity中的回馈代码为
public class SportMapActivity extends AppCompatActivity{
...
private void exit(){
// 调用之处
setResult(22);
finish();
}
...
}
原因分析
问题出现在Fragment中的这一行代码
startActivityForResult(intent, 11);
因为是在Fragment当中,因此上下文是Fragment的上下文,虽然是嵌在Activity中,也能用startActivityForResult()方法,但是由于环境是Fragment的,直接使用的话相当于this.startActivityForResult(),这里的this指的是Fragment,因此回调在父Activity中便会找不到。
问题解决
如果在父Activity#onActivityResult()中回调,则需要改一下调用的对象:
// 使用getActivity()获取父Activity的对象,改为父Activity的上下文
getActivity().startActivityForResult(intent, 11);
使用getActivity()获取父Activity的对象,改为父Activity的上下文,即可。