最近工作,接手了项目,测试发现有一个bug,就是在Fragment中使用startActivityForResult(Intent intent,int requestcode) 方法调用其他activity,重写onActivityforResult方法,但是onActivityforResult并没有被调用。
这个问题的解决思路就是两个方面。
先从onActivityforResult入手,在方法第一句打印log,发现没有被执行,说明问题发生在这之前。
再从startActivityForResult入手,调用的Activity正确被调用,并且一直执行到setResult方法,查看responseCode也没有问题,说明不是被调用的Activity的问题。
那么问题就应该发生在startActivityForResult上了。
getActivity().startActivityForResult(new Intent(getActivity(), CaptureActivity.class), REQUESTCODE_SCAN);
这是原来错误的写法,查看源码,fragment的getActivity方法返回了一个FragmentActivity的对象;
此时调用的是FragmentActivity的startActivityForResult方法。
问题就发生在这里。
正确的写法是直接在Fragment中使用Fragment的startActivityForResult方法。
startActivityForResult(new Intent(getActivity(), CaptureActivity.class), REQUESTCODE_SCAN);
修改后正常调用了onActivityforResult。
查看Fragment.startActivityForResult()方法,源码如下:
public void startActivityForResult(Intent intent, int requestCode) { if (mActivity == null) { throw new IllegalStateException("Fragment " + this + " not attached to Activity"); } mActivity.startActivityFromFragment(this, intent, requestCode); }
也就是说在fragment中的调用顺序是:
1.Fragment.startActivityForResult()
2.FragmentActivity.startActivityFormFragment()
3.Activity.startActivityForResult()
而如果使用了getActivity()的调用顺序是:
1.FragmentAcitvity.startActivityForResult()
2.Activity.startActivityForResult()
这就是二者的区别,导致了onActivityResult()不能调用。
<p>版权声明:本文为博主原创文章,未经博主允许不得转载。</p>