Fragment里onActivityResult()无回调的问题

来源:互联网 发布:linux 视频点播服务器 编辑:程序博客网 时间:2024/05/21 17:26

最近工作,接手了项目,测试发现有一个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()不能调用。

0 0