Fragment中不执行onActivityResult();

Fragment中不执行onActivityResult();

1.问题描述:

FirstActivity中嵌套fragment,叫做FragmentA,SecondActivity也嵌套Fragment,叫做FragmentB,现在的需求就是,在FragmentA中通过startActivityForResult启动SecondActivity,然后在销毁SecondActivity后,将数据带回到FragmentA,但是通过activity那种方式不走onActivityResult()这个方法。

解决问题的方法:


我们需要在firstActivity中重写onActivityResult(),并调super.onActivityResult(),通过在fragment也重写这个函数,把getActivtiy().startActivityForResult换成startActivityForResult即可。

为啥要在FirstActivity中重写onActivityResult(),从下面源码可以看出,如果过targetFragment不为空,它会调用targetFragment.onActivityResult(requestCode & 0xffff, resultCode, data),指向的就是fragment的onActivityResult(),这下明白为啥了把,也就说,若想startActivityForResult和onActivityResult()两者通信,需要两者在同一个上下文中就可以了。
不要一味的用getActivity().startActivityForResult()启动Activity,若在fragment中需要去掉getActivity()。

@Override
    protected void onActivityResult(int requestCode, int resultCode, Intent data) {
        mFragments.noteStateNotSaved();
        int requestIndex = requestCode>>16;
        if (requestIndex != 0) {
            requestIndex--;

            String who = mPendingFragmentActivityResults.get(requestIndex);
            mPendingFragmentActivityResults.remove(requestIndex);
            if (who == null) {
                Log.w(TAG, "Activity result delivered for unknown Fragment.");
                return;
            }
            Fragment targetFragment = mFragments.findFragmentByWho(who);
            if (targetFragment == null) {
                Log.w(TAG, "Activity result no fragment exists for who: " + who);
            } else {
                targetFragment.onActivityResult(requestCode & 0xffff, resultCode, data);
            }
            return;
        }

        super.onActivityResult(requestCode, resultCode, data);
    }

欢迎交流

你可能感兴趣的:(Android)