大家或许有遇到这个神坑,在Fragment中使用startActivityForResult能够成功,可是在Fragment中的onActivityResult却无法被调用。一不注意就让人一夜愁白了头。苦经探索(当然包括亲爱的百度和谷歌),终于总结出了一些规律。

在Fragment中使用startActivityForResult之后,onActivityResult的调用是从activity中开始的(即会先调用activity中的onActivityResult)。

一.只嵌套了一层Fragment(比如activity中使用了viewPager,viewPager中添加了几个Fragment)

在这种情况下要注意几个点:

1.在Fragment中使用startActivityForResult的时候,不要使用getActivity().startActivityForResult,而是应该直接使startActivityForResult()。

2.如果activity中重写了onActivityResult,那么activity中的onActivityResult一定要加上super.onActivityResult(requestCode, resultCode, data)。

如果违反了上面两种情况,那么onActivityResult只能够传递到activity中的,无法传递到Fragment中的。

没有违反上面两种情况的前提下,可以直接在Fragment中使用startActivityForResult和onActivityResult,和在activity中使用的一样。

二.嵌套多层Fragment(比如activity中使用了viewPager,viewPager中添加了几个Fragment,即第一层Fragment。其中一个Fragment又使用了一个ViewPager,这个ViewPager又加入了几个Fragment,即第二层Fragment)

在这种情况下activity中的onActivityResult调用无法传到第二层Fragment中。自己动手丰衣足食,我们只有手动传了。

package neo.door.main;

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 MyBaseFragmentActivity extends FragmentActivity
{
private String TAG="MyBaseFragmentActivity";
@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data)
{
super.onActivityResult(requestCode, resultCode, data);
FragmentManager fragmentManager=getSupportFragmentManager();
for(int indext=0;indext<fragmentManager.getFragments().size();indext++)
{
Fragment fragment=fragmentManager.getFragments().get(indext); //找到第一层Fragment
if(fragment==null)
Log.w(TAG, "Activity result no fragment exists for index: 0x"
+ Integer.toHexString(requestCode));
else
handleResult(fragment,requestCode,resultCode,data);
}
}
/**
* 递归调用,对所有的子Fragment生效
* @param fragment
* @param requestCode
* @param resultCode
* @param data
*/
private void handleResult(Fragment fragment,int requestCode,int resultCode,Intent data)
{
fragment.onActivityResult(requestCode, resultCode, data);//调用每个Fragment的onActivityResult
Log.e(TAG, "MyBaseFragmentActivity");
List<Fragment> childFragment = fragment.getChildFragmentManager().getFragments(); //找到第二层Fragment
if(childFragment!=null)
for(Fragment f:childFragment)
if(f!=null)
{
handleResult(f, requestCode, resultCode, data);
}
if(childFragment==null)
Log.e(TAG, "MyBaseFragmentActivity1111");
} }

让activity继承上面的MyBaseFragmentActivity 。这样就手动把onActivityResult的调用传递到每一层的每一个Fragment里面了。然后在每一个Fragment里面重写onActivityResult就行了,然后根据requestCode和resultCode来分别执行对应事件。

当然,不管是哪个Fragment调用startActivityForResult,onActivityResult的调用都会传递到每个Fragment中。

同样需要注意:

1.如果activity中重写了onActivityResult,那么activity中的onActivityResult一定要加上super.onActivityResult(requestCode, resultCode, data),否则也无法传进Fragment中。

不过有点值得注意的是:

在所有的Fragment中若是直接使用startActivityForResult(),那么传到activity中的onActivityResult中的requestCode就会不对,resultCode是对的,当然,这样的话传到每个Fragment中的onActivityResult的requestCode也是不对的(这里大家留意一下,评论里有人说传到Fragment中的是对的)。若是用getActivity().startActivityForResult,则传出来的requestCode和rusultCode就都是对的。

当然若是直接按返回键返回,那么会自动给一个resultCode,这个resultCode和我们设定的是不一样的,因此在重写onActivityResult的时候需要判定resultCode。

由于我们是手动将activity中的onActivityResult的调用传进每一层的每一个Fragment中去的,所以不管在Fragment中是使用startActivityForResult(),还是使用getActivity().startActivityForResult,都没关系,使用getActivity().startActivityForResult不会出现activity中onActivityResult中的调用无法传进去的情况。会影响的只有requestCode。

转载请标明出处,维权必究:

https://www.cnblogs.com/tangZH/p/5930491.html

http://77blogs.com/?p=11

谈谈Fragment中的onActivityResult的更多相关文章

  1. Android 在Fragment中执行onActivityResult不被调用的简单解决方法

    在Android开发中,我们经常会用到FragmentActivity下嵌套多个Fragment,但是在开发过程中会发现在嵌套的Fragment中使用onActivityResult回调方法没有被执行 ...

  2. Android踩坑随笔Fragment中onActivityResult方法不被调用

    最近项目里要做头像功能,参考了这篇博客(GitHub - zhudfly/SelectAvatarApplication: 一个选择并显示头像圆形控件,可以通过拍照或者选择相册中的图片来设置图片),但 ...

  3. 关于Fragment 不响应onActivityResult的情况分析 (

    大家都知道,可以通过使用 startActivityForResult() 和 onActivityResult() 方法来传递或接收参数. 但你是否遭遇过onActivityResult()不执行或 ...

  4. [转] Fragment——startActivityForResult后onActivityResult无反应之问题总结

    转自:http://m.blog.csdn.net/article/details?id=49507025 摘取片段如下 个人测试后的一些总结: 1.Fragment中直接使用startActivit ...

  5. Fragment中onActivityResult不响应

    开发中遇到Fragment中onActivityResult不响应的问题,曾经见过. 不少同学说处理方法是在与Fragment绑定的FragmentActivity中重写onActivityResul ...

  6. Android的Fragment中onActivityResult不被调用的解决方案

    常见的,我们会在FragmentActivity中嵌套一层Fragment使用,甚至两次或多层Fragment嵌套使用.这个时候,在第二级或者更深级别的Fragment调用startActivityF ...

  7. Android的Fragment中onActivityResult不被调用

    1.检查该Fragment所属的Activity中,是否重写了onActivityResult方法. 2.检查Fragment中的startActivityForResult的调用方式. 请确保不要使 ...

  8. Android Fragment中使用Intent组件拍照

    要在activity里面去接受,然后传递给fragment对象,fragment有很多回调调用不到 你的设备有摄像头吗? 为了确保市场上的大多数设备都能运行你的程序,必须在项目中做一些检测,保证使用的 ...

  9. Android Fragment使用(四) Toolbar使用及Fragment中的Toolbar处理

    Toolbar作为ActionBar使用介绍 本文介绍了在Android中将Toolbar作为ActionBar使用的方法. 并且介绍了在Fragment和嵌套Fragment中使用Toolbar作为 ...

随机推荐

  1. HTML中哪些标签的值会被提交到服务器呢?

    <form> <input name="">标签 <select name="">标签 <textarea name= ...

  2. 窥探Swift编程之错误处理与异常抛出

    在Swift 2.0版本中,Swift语言对其错误处理进行了新的设计,当然了,重新设计后的结果使得该错误处理系统用起来更爽.今天博客的主题就是系统的搞一下Swift中的错误处理,以及看一下Swift中 ...

  3. iOS开发之SQLite-C语言接口规范(二) —— Prepared Your SQL Statements

    在<SQLite的C语言接口规范(一)>中介绍了如何去连接打开数据库,本篇博客就介绍如何操作数据库,本篇主要给出了如何执行数据库查询语句(Select), 然后遍历结果集.本篇博客就直接使 ...

  4. [c++] Smart Pointers

    内存管理方面的知识 基础实例: #include <iostream> #include <stack> #include <memory> using names ...

  5. [OpenCV] Samples 12: laplace

    先模糊再laplace,也可以替换为sobel等. 变换效果后录成视频,挺好玩. #include "opencv2/videoio/videoio.hpp" #include & ...

  6. PHP环境配置-从Apache官网下载windows版apache服务器

    由于个人有强迫倾向,下载软件都喜欢从官网下载,摸索了好久终于摸清楚怎么从Apache官网下载windows安装版的Apache服务器了,现在分享给大家. 进入apache服务器官网http://htt ...

  7. react-native 学习之Image篇

    /** * Sample React Native App * https://github.com/facebook/react-native */ 'use strict'; import Rea ...

  8. phpStorm入门

    首先在官网上下载并安装:http://www.jetbrains.com/phpstorm/; 安装成功后需要激活: IntelliJ IDEA开源社区 提供了如下通用激活方法: 注册时选择Licen ...

  9. Oracle索引梳理系列(四)- Oracle索引种类之位图索引

    版权声明:本文发布于http://www.cnblogs.com/yumiko/,版权由Yumiko_sunny所有,欢迎转载.转载时,请在文章明显位置注明原文链接.若在未经作者同意的情况下,将本文内 ...

  10. [WCF编程]4.契约概述

    一.契约的基本概念 契约是消息参与者之间的约定.在SOA架构中,契约提供了服务通信所必需的元数据.契约用来定义数据类型,操作,消息交换模式和消息交换使用的传输协议.契约通常是在标准化平台中使用与编程语 ...