Fragment中startActivityForResult没有执行回调

在ViewPager中的Fragment不执行回调,解决步骤:

1.检查Fragment中的onActivityResult()方法中是否写了super.onActivityResult,切记这里千万不要手贱给删了。不然就像我懵逼了半个多小时。

2.检查Fragment中的startActivityForResult的调用方式,不要getActivity().startActivityForResult(),因为这样会让回调回到Activity中。直接startActivityForResult() 或者 用 Fragment.this.去调用。

3.检查你setResult时,是否有onBackPressed()这种方法, setResult()这个方法得写在super.onBackPressed()方法前,否则resultCode 用于是0 接收不到。

如果以上还没有解决你问题,那么只能用下面的方法了:

   public class BaseFragmentActiviy extends FragmentActivity {
        private static final String TAG = "BaseActivity";

        @Override
        protected void onActivityResult(int requestCode, int resultCode, Intent data) {
            FragmentManager fm = getSupportFragmentManager();
            int index = requestCode >> 16;
            if (index != 0) {
                index--;
                if (fm.getFragments() == null || index < 0
                        || index >= fm.getFragments().size()) {
                    Log.w(TAG, "Activity result fragment index out of range: 0x"
                            + Integer.toHexString(requestCode));
                    return;
                }
                Fragment frag = fm.getFragments().get(index);
                if (frag == null) {
                    Log.w(TAG, "Activity result no fragment exists for index: 0x"
                            + Integer.toHexString(requestCode));
                } else {
                    handleResult(frag, requestCode, resultCode, data);
                }
                return;
            }

        }

        /**
         * 递归调用,对所有子Fragement生效
         *
         * @param frag
         * @param requestCode
         * @param resultCode
         * @param data
         */
        private void handleResult(Fragment frag, int requestCode, int resultCode,
                                  Intent data) {
            frag.onActivityResult(requestCode & 0xffff, resultCode, data);
            List<Fragment> frags = frag.getChildFragmentManager().getFragments();
            if (frags != null) {
                for (Fragment f : frags) {
                    if (f != null)
                        handleResult(f, requestCode, resultCode, data);
                }
            }
        }
    }

使用的时候继承自这个方法,启动的时候使用下面的方法

/**
  * 得到根Fragment
  * 
  * @return
  */
 private Fragment getRootFragment() {
  Fragment fragment = getParentFragment();
  while (fragment.getParentFragment() != null) {
   fragment = fragment.getParentFragment();
  }
  return fragment;

 }

 /**
  * 启动Activity
  */
 private void onStartActivityTest() {
  Intent intent = new Intent();
  intent.setClass(getActivity(), TestActivity.class);
  intent.putExtra("TAG","richard test start!"); 
  getRootFragment().startActivityForResult(intent, 1001);
 }

当然这个方法,可能在以前老的编译环境下用得着。6.0的系统开发环境上是用不着的,源码启动方式发生了改变,google对这个问题进行了修复。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值