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

  常见的,我们会在FragmentActivity中嵌套一层Fragment使用,甚至两次或多层Fragment嵌套使用。这个时候,在第二级或者更深级别的Fragment调用startActivityForResult方法时,将无法收到onActivityResult回调。阅读FragementActivity源码后发现,原来是源码里没有处理嵌套Fragment的情况,也就是说回调只到第一级Fragment,就没有继续分发。我们可以实现一个自己的AppCompatActivity,来实现继续分发,如下:

 1 public class CustomAppCompatActivity extends AppCompatActivity {
 2
 3
 4     private static final String TAG = "TAG";
 5
 6
 7     /**
 8      * 重写onactivityresult方法,使二个或多个fragment嵌套使用时能收到onactivityresut回调
 9      * @param requestCode
10      * @param resultCode
11      * @param data
12      */
13     @Override
14     protected void onActivityResult(int requestCode, int resultCode, Intent data) {
15         FragmentManager fm = getSupportFragmentManager();
16         int index = requestCode >> 16;
17         if (index != 0) {
18             index--;
19             if (fm.getFragments() == null || index < 0
20                     || index >= fm.getFragments().size()) {
21                 Log.w(TAG, "Activity result fragment index out of range: 0x"
22                         + Integer.toHexString(requestCode));
23                 return;
24             }
25             Fragment frag = fm.getFragments().get(index);
26             if (frag == null) {
27                 Log.w(TAG, "Activity result no fragment exists for index: 0x"
28                         + Integer.toHexString(requestCode));
29             } else {
30                 handleResult(frag, requestCode, resultCode, data);
31             }
32             return;
33         }
34
35     }
36
37     /**
38      * 递归调用,对所有子Fragement生效
39      *
40      * @param frag
41      * @param requestCode
42      * @param resultCode
43      * @param data
44      */
45     private void handleResult(Fragment frag, int requestCode, int resultCode,
46                               Intent data) {
47         frag.onActivityResult(requestCode & 0xffff, resultCode, data);
48         List<Fragment> frags = frag.getChildFragmentManager().getFragments();
49         if (frags != null) {
50             for (Fragment f : frags) {
51                 if (f != null)
52                     handleResult(f, requestCode, resultCode, data);
53             }
54         }
55     }
56
57 }

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

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

 }

 /**
  * 启动Activity
  */
 private void onClickTextViewRemindAdvancetime() {
  Intent intent = new Intent();
  intent.setClass(getActivity(), YourActivity.class);
  intent.putExtra("TAG","TEST");
  getRootFragment().startActivityForResult(intent, 1000);
 }

附上github: https://github.com/974648183/CustomAppCompatActivity-

时间: 2024-12-14 05:11:19

Android的Fragment中onActivityResult不被调用的解决方案的相关文章

Android的Fragment中onActivityResult不被调用的解决方案(绝对管用)

常见的,我们会在FragmentActivity中嵌套一层Fragment使用,甚至Fragment下层层嵌套使用.这个时候,在第二级或者更深级别的Fragment将无法收到onActivityResult回调,查看FragementActivity的源码发现: public void startActivityFromFragment(Fragment fragment, Intent intent, : int requestCode) { : if (requestCode == -1)

在Fragment中OnActivityResult方法中接收Activity中返回的值

在Fragment中OnActivityResult方法中接收Activity中返回的值 在Fragment中OnActivityResult方法中接收Activity中返回的值,有需要的朋友可以参考下. 在开发android中,有些人往往很疑惑,当一个FragmentActivity中有多个碎片的时候,如a,b,c三个碎片, 其中b中进行了操作,跳转到了新的界面D(activity).但是当D操作完后,返回值到碎片b.那么问题就来了,肯定会有人问,b是一个碎片,如何才能接收到D传过来的值呢?

Fragment中onActivityResult不响应

开发中遇到Fragment中onActivityResult不响应的问题,曾经见过. 不少同学说处理方法是在与Fragment绑定的FragmentActivity中重写onActivityResult方法.返回的result先传至Fragment的host FragmentActiivity.这个FragementActivity的onActivityResult函数必须调用 super.onActiivtyResult().super.onActiivtyResult会将未被处理的resul

Android的Fragment中的互相通信-桥梁activity

Android的Fragment中的互相通信-桥梁activity 效果图如下: 项目结构图如下: Fragment1: package com.demo.fragmenttongxin; import android.app.Activity; import android.app.Fragment; import android.os.Bundle; import android.view.LayoutInflater; import android.view.View; import an

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

在Android开发中,我们经常会用到FragmentActivity下嵌套多个Fragment,但是在开发过程中会发现在嵌套的Fragment中使用onActivityResult回调方法没有被执行. 网上也有很多解决方法,但是说的都比较麻烦,所以今天给大家推荐一种超简单的用法, 在Fragment和FragmentActivity中都要重写onActivityResult方法,并且要保证两者的请求码或者结果码一致.代码如下: 在FragmentActivity中 @Override prot

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

最近项目里要做头像功能,参考了这篇博客(GitHub - zhudfly/SelectAvatarApplication: 一个选择并显示头像圆形控件,可以通过拍照或者选择相册中的图片来设置图片),但是在使用过程中出现拍照无响应,几经查找,原因是在Fragment中覆写onActivityResult()方法的同时,必须要在他父类FragmentActivity中再次覆写onActivityResult()才能使接收到返回数据(比如拍照返回). 第一步:在该Fragment父类的Fragment

Android 在 Fragment 中使用 getActivity() NullPointException 的思考和解决办法

问题: 使用 AS 在 Fragment 中调用 getActivity() 方法的时候会出现可能为空指针的提醒 使用 monkey 多次十万次测试,会出现 getActivity() NullPointException 的情况 思考 为什么会出现这种情况,按说当前 Activity 存在,在 Fragment 中使用 getActivity() 是可以拿到的,不应该为空的 源码 fragment 的生命周期 以下源码基于 API 26 getActivity 可能为 Null, 跟进源码,可

android 在Fragment 中使用ormlite 数据库

在ormlite官方的demo中,Activity 中访问数据库是extends ormliteBaseActivity. 那在Fragment中怎么使用呢? 简单的: public class OrmLiteFragment extends Fragment {     private DatabaseHelper databaseHelper = null;     protected DatabaseHelper getHelper() {         if (databaseHelp

Fragment中的setUserVisibleHint()方法调用

使用Fragment的时候难免会遇到想在视图可见与不可见之中做些操作,此时通常会想到类似Activity中的onResume()和onPause()方法.Fragment中也确实有这两个方法,然而亲测support.v4.Fragment中的这两个方法其实是执行的Activity的方法,也就是只有在Activity的可视性发生变化时才会调用.又从网上找到类似的方法,setUserVisibleHint(), 但是事实证明改方法也不见得就能满足需求,在Fragment中重写该方法系统并不会调用改方