Fragment中的onActivityResult不被调用,有几种情况,请大家一一排查。

 

1.检查该Fragment所属的Activity中,是否重写了onActivityResult方法。

如果是该种情况,请确保写了super.onActivityResult:

Java代码  
  1. @Override  
  2. protected void onActivityResult(int requestCode, int resultCode, Intent data) {  
  3.     super.onActivityResult(requestCode, resultCode, data);  
  4.     if (resultCode == RESULT_OK) {  
  5.         //Activity中相关处理代码  
  6.     }  
  7. }  

 

2.检查Fragment中的startActivityForResult的调用方式。

请确保不要使用getActivity().startActivityForResult方法(此时需要在该Fragment所依赖的Activity中重写onActivityResult方法),而是要直接使用startActivityForResult。

 

3.如果以上两方面都没能解决问题,很可能是如下情况了,略有复杂:

该情况是在support library中使用了Nested Fragment,就是说在Fragment中进行了嵌套,比如用ViewPager展示Fragment等情况。这可以算Google的一个Bug,具体可参见这篇博客:

http://blog.shamanland.com/2014/01/nested-fragments-for-result.html

解决方案:

最好的方式是写一个BaseActivity继承FragmentActivity,重写onActivityResult方法,你用到的Activity都继承BaseActivity来做。BaseActivity具体实现:

 

Java代码  
  1. package com.jupaidaren.android;  
  2.   
  3. import java.util.List;  
  4.   
  5. import android.content.Intent;  
  6. import android.support.v4.app.Fragment;  
  7. import android.support.v4.app.FragmentActivity;  
  8. import android.support.v4.app.FragmentManager;  
  9. import android.util.Log;  
  10.   
  11. abstract public class BaseActivity extends FragmentActivity {  
  12.   
  13.     private static final String TAG = "BaseActivity";  
  14.   
  15.     @Override  
  16.     protected void onActivityResult(int requestCode, int resultCode, Intent data) {  
  17.         FragmentManager fm = getSupportFragmentManager();  
  18.         int index = requestCode >> 16;  
  19.         if (index != 0) {  
  20.             index--;  
  21.             if (fm.getFragments() == null || index < 0  
  22.                     || index >= fm.getFragments().size()) {  
  23.                 Log.w(TAG, "Activity result fragment index out of range: 0x"  
  24.                         + Integer.toHexString(requestCode));  
  25.                 return;  
  26.             }  
  27.             Fragment frag = fm.getFragments().get(index);  
  28.             if (frag == null) {  
  29.                 Log.w(TAG, "Activity result no fragment exists for index: 0x"  
  30.                         + Integer.toHexString(requestCode));  
  31.             } else {  
  32.                 handleResult(frag, requestCode, resultCode, data);  
  33.             }  
  34.             return;  
  35.         }  
  36.   
  37.     }  
  38.   
  39.     /** 
  40.      * 递归调用,对所有子Fragement生效 
  41.      *  
  42.      * @param frag 
  43.      * @param requestCode 
  44.      * @param resultCode 
  45.      * @param data 
  46.      */  
  47.     private void handleResult(Fragment frag, int requestCode, int resultCode,  
  48.             Intent data) {  
  49.         frag.onActivityResult(requestCode & 0xffff, resultCode, data);  
  50.         List frags = frag.getChildFragmentManager().getFragments();  
  51.         if (frags != null) {  
  52.             for (Fragment f : frags) {  
  53.                 if (f != null)  
  54.                     handleResult(f, requestCode, resultCode, data);  
  55.             }  
  56.         }  
  57.     }  
  58. }  

更多相关文章

  1. Android(安卓)studio gradle配置完整版(转)
  2. android ListView在数据为空的时候headView和footerview不显示
  3. RecyclerView导入依赖包
  4. android中使用OpenGL ES
  5. android studio 报错Failed to save settings解决方法
  6. cocos2dx生成android时出错解决方法
  7. Android(安卓)架构师之路20 响应式编程RxJava操作符源码分析与实
  8. 通过Criteria获取LocationProvider
  9. Android(安卓)属性动画 源码解析 深入了解其内部实现

随机推荐

  1. Android中Activity状态的保存和恢复:onSav
  2. Android之自定义ContentProvider详解
  3. android Toast
  4. android模拟器发送短信和打电话
  5. Android网络开发技术实战详解
  6. 转android四种动画
  7. 学习笔记(01):FFmpeg打造Android万能音频
  8. Android获取用户已安装app列表
  9. Android(安卓)平台上,界面元素在定时器的
  10. 【Arcgis for android】相关教程收集自网