Andriod中多层fragment相套时onActivityResult()方法不被调用的原因

Fragment是常用到的,一般在Activity里我们会套用Fragment的使用,有时是一层,有的时候是多层,当你在第二层的Fragment中调用onActivityResult()方法时,你会发现onActivityResult()方法不被执行。举个简单的例子



一个主Activity里嵌套了一个fragmentA碎片,fragmentA碎片里又嵌套了一个fragmentB碎片,当我们在fragmentB中调用手机系统相册随机选择一张照片时,当我们选择好了照片,返回到fragmentB中时,我们发现onActivityResu()方法未被执行,所以我们拿不到所选照片的path。为什么会出现这种情况呢

阅读FragmentActivty源码后会发现,原来源码里是没有处理嵌套Fragment的情况,也就是说回调只到第一级Fragment,就没有继续分发。我们可以实现一个自己的BaseActivity,来实现继续分发。

import java.util.List;

import android.content.Intent;
import android.support.v4.app.Fragment;
import android.support.v4.app.FragmentActivity;
import android.support.v4.app.FragmentManager;
import android.util.Log;
public class BaseActivity 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);
	   }
	  }
	 }
}

然后让自己的Activity继承这个BaseACtivity即可,但是要注意,在Fragment调用startActivityForResult时,一定要调用根Fragment的启动方法,如下:

private Fragment getRootFragment() {
		  Fragment fragment = getParentFragment();
		  while (fragment.getParentFragment() != null) {
		   fragment = fragment.getParentFragment();
		  }
		  return fragment;

		 }
	

// 从相册中获取
	public void gallery() {
		
		// 激活系统图库,选择一张图片
		Intent intent = new Intent(Intent.ACTION_PICK,android.provider.MediaStore.Images.Media.EXTERNAL_CONTENT_URI);		
		// 开启一个带有返回值的Activity,请求码为PHOTO_REQUEST_GALLERY
		// 修改无裁剪
		getRootFragment().startActivityForResult(intent, UNPHOTO_REQUEST_CUT);
	}
这样就可以解决上面所说的问题了。




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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值