`
iamzhaozheng
  • 浏览: 160808 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

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

阅读更多

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

 

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

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

	@Override
	protected void onActivityResult(int requestCode, int resultCode, Intent data) {
		super.onActivityResult(requestCode, resultCode, data);
		if (resultCode == RESULT_OK) {
			//Activity中相关处理代码
		}
	}

 

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

请确保不要使用getActivity().startActivityForResult方法,而是要直接使用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具体实现:

 

package com.jupaidaren.android;

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;

abstract 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);
			}
		}
	}
}

 

1
0
分享到:
评论
1 楼 qluojieq 2016-02-03  
写得很好,学习了,

相关推荐

    快速解决fragment中onActivityResult不调用的问题

    通过遵循这些解决方案,你应该能够有效地解决Fragment中的`onActivityResult`不调用问题。在实际开发中,还需要注意Android系统的版本差异以及兼容性问题,确保代码在不同设备和Android版本上都能正常工作。同时,...

    Android中Fragment多层嵌套时onActivityResult无法正确回调问题的解决方法

    常常会遇到一个问题:通过startActivityForResult启动Activity,然后希望在Fragment的onActivityResult中接收结果,但是只有最外层的Fragment能够接收到回调,而内嵌的Fragment则接收不到。这个问题困扰了许多开发者...

    Android巧用Fragment解耦onActivityResult详解

    在Android开发中,`onActivityResult()` 是一个关键的方法,它用于处理从子Activity返回的结果。然而,当涉及到多个Fragment交互时,尤其是需要处理`startActivityForResult()` 的回调,`onActivityResult()` 往往会...

    Android-避免onActivityResult和onRequestPermissionsResult烦恼requestCode的问题

    在Android应用开发中,`onActivityResult`和`onRequestPermissionsResult`是两个重要的回调方法,用于处理从其他Activity返回的结果和权限请求。然而,在大型项目或复杂应用中,管理这些请求码(requestCode)可能会...

    Android中Fragment管理及重叠问题的解决方法

    值得注意的是,当从第二个Fragment返回第一个Fragment时,第一个Fragment只是从不可见变为可见,生命周期中的`onPause()`等方法并不会被调用。 然而,如果使用`replace()`方法,旧的Fragment会被完全移除,新的...

    Fragment回调接口

    总结起来,Fragment回调接口是Android应用开发中不可或缺的一部分,它使Fragment和Activity以及Fragment之间的通信变得简单和有序。熟练掌握这些回调方法以及数据传递方式,对于编写健壮且灵活的Android应用程序至关...

    Android在Fragment中实现监听触摸事件

    "Android在Fragment中实现监听触摸事件" Android在Fragment中实现监听触摸事件是指在Android应用程序中,如何在Fragment中监听触摸事件。Fragment是Android应用程序中的一个组件,它可以在Activity中使用,但是它并...

    Android Fragment切换动画

    在Android应用开发中,Fragment是UI组件的一种,它允许我们构建可重用的模块化界面。Fragment可以在Activity中动态添加、删除或替换,这在设计适应不同屏幕尺寸和配置的应用时非常有用。当我们想要增强用户体验,使...

    Fragment中实现dateDialog的调用

    在Fragment中实现了调用dateDialog控件选取日期,并将日期显示出来

    Android fragment切换动画.rar

    在Android应用开发中,Fragment是UI组件的一种,用于在大屏幕设备上实现多屏或复合视图。Fragment可以在Activity之间动态地添加、移除或替换,使得应用在不同屏幕尺寸和配置下都能提供良好的用户体验。"Android ...

    Android Activity内嵌Fragment,当Activity recreate时Fragment被添加多次,造成界面重叠

    在Android应用开发中,Activity和Fragment是两个核心组件。Activity作为应用程序的主要入口点,而Fragment则作为可重用的UI块,可以在多个Activity之间切换或组合。然而,在使用Fragment时,有时会出现一个问题:当...

    Android使用Fragment实现标签页

     Fragment不能独立存在,它必须嵌入到Activity中,因此 Fragment的生命周期也依赖于Activity的生命周期,当其依赖的Activity的某个生命周期方法被调用时,该Activity下包含的所有Fragment的相应生命周期方法也将被...

    FragmentPagerAdapter调用notifyDataSetChanged无效及解决方案

    在Android开发中,`FragmentPagerAdapter`是用于管理`ViewPager`中的`Fragment`序列的一个关键组件。然而,有时候开发者可能会遇到一个问题:当尝试调用`FragmentPagerAdapter`的`notifyDataSetChanged()`方法来更新...

    Android中fragment嵌套fragment问题解决方法

    为解决这个问题,需要在Activity A的onActivityResult方法中调用`super.onActivityResult(requestCode, resultCode, data)`,这样可以确保子Fragment的onActivityResult也能正常工作。 ```java @Override ...

    Android Fragment

    Android Fragment是Android应用程序开发中的一个核心组件,它在Android 3.0(API级别11)版本被引入,主要用于创建动态且模块化的用户界面。Fragment的设计理念是为了更好地适应多屏幕设备,使得开发者能够将UI的...

    Android 关于fragment切换重新加载的解决方法

    在项目中需要进行Fragment的切换,一直都是用replace()方法来替换Fragment 但是,这样会有一个问题 ,应该很多朋友都遇到过: 每次切换的时候,Fragment都会重新实例化,也就是运行OnCreatVIew()方法 那么如何让多个...

    Android Fragment的简单使用(静态)

    在Android应用开发中,Fragment是Android SDK提供的一种组件,它允许开发者在Activity中创建可重用的UI块。Fragment的设计使得应用程序能更好地适应不同屏幕尺寸和配置,如手机和平板。"Android Fragment的简单使用...

    Android中在xml中静态添加Fragment

    在Android应用开发中,Fragment是Android SDK提供的一种组件,它允许开发者在单个Activity中实现多个可交互的屏幕区域。Fragment的设计使得应用可以更好地适应不同的屏幕尺寸和配置,如手机和平板。本教程将深入讲解...

    Android Fragment实例

    在Android应用开发中,Fragment是Android SDK中的一个重要组件,它被设计用来支持多屏幕适配和增强用户界面的模块化。Fragment允许开发者将应用程序的功能或UI部分分解为独立的、可重用的组件,这些组件可以在不同的...

Global site tag (gtag.js) - Google Analytics