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

news/2025/5/30 10:42:37

大家都知道,可以通过使用 startActivityForResult() 和 onActivityResult() 方法来传递或接收参数。


但你是否遭遇过onActivityResult()不执行或者未按预想的那样执行的情况呢?

这里我总结了三种情况:

1、执行startActivityForResult,没等到被调用的 Activity 返回,onActivityResult() 就被执行了。
找了很久,终于通过小道消息得知,这与 Activity 的加载模式(launchMode)有关,该属性可以在 AndroidManifest.xml 中设置。
原先将其设为 singleInstance,经测试,所有需要传递或接收的 Activity 不允许设置该属性,或只能设为标准模式,否则系统将在 startActivityForResult() 后直接调用 onActivityResult()。

Note that this method should only be used with Intent protocols
* that are defined to return a result. In other protocols (such as
* {@link Intent#ACTION_MAIN} or {@link Intent#ACTION_VIEW}), you may
* not get the result when you expect. For example, if the activity you
* are launching uses the singleTask launch mode, it will not run in your
* task and thus you will immediately receive a cancel result.

2、两个activity传递数据和返回数据时,请求方的onActivityResult始终无响应,通过debug调试模式也没见调用该方法。查看了 各种配置和程序代码,均未发现有错误之处。后来仔细阅读API说明,恍然大悟,原来是调用startActivityForResult的参数问题,即调 用时这样:
startActivityForResult(intent, 0);是第二个参数的问题,该参数必须大于0才能在返回值并激活onActivityResult方法

我最开始是用的一个activity默认的常量:RESULT_OK,跟踪了代码后发现,该常量的值为-1,当然没法激活 onActivityResult方法了,随后随便修改为一个大于0的整数,程序即通跑成功。
startActivityForResult(intent, 1); //这样就行了

API描述:
@requestCode If >= 0, this code will be returned in onActivityResult() when the activity exits.

 3、在TabHost的子Activity中startActivityForResult调用其他Activity时候遭遇到onActivityResult方法不响应的问题。可以通过调用Activity的getCallingActivity()查看要接受数据的Activity。

API这么解释的:

Return the name of the activity that invoked this activity. This is
* who the data in {@link #setResult setResult()} will be sent to.

举个列子,有两个ActivityA和B,A中执行startActivityForResult(1,new Intent(A,B.class));

即由A调到B,再B执行setResult后执行getCallingActivity(),显示A。


解决办法如下:

1.通过父Activity启动其他Activity;

2.实现父Activity的onActivityResult方法,将该处接收到的请求转发给当前活动的子Activity;

3.自定义一个转发接口用来实现第2步中的转发功能;

4.子Activity中实现第3步接口中的方法用来接收返回信息;


代码如下:

1.通过父Activity启动其他Activity
1 getParent().startActivityForResult(new Intent(...), REQUEST_CODE); 
2.实现父Activity的onActivityResult方法

3.自定义接口
public interface OnTabActivityResultListener {

public void onTabActivityResult(int requestCode, int resultCode, Intent data);

}

4.子Activity需要实现onTabActivityResult方法
@Override

public void onTabActivityResult(int requestCode, int resultCode, Intent data) {

if (requestCode == REQUEST_CODE && resultCode == RESULT_OK) {

//实现该处逻辑
        ...

}

}
总结:凡是Activity本身含有上次父类的情况都不能直接使用startActivityForResult,而要通过getParent(),通过父类调用此方法。

此种情况也适用于多重Fragment嵌套使用的情况。

理论上使用FragmentActivity 和 Fragment组合时,在Fragment中调用startActivityForResult方法,实际上是调用Fragment所依付的Activity的startActivityForResult方法。然后Fragment
Activity会先响应自身的onActivityResult方法,再传递到当前活动的Fragment中。此时,通过重载Fragment的onActivityResult方法可以接受返回事件。

这里需要注意,如果重载了FragmentActivity的 onActivityResult方法,一定要调用super. onActivityResult(),否则Fragment中的 onActivityResult方法不会被调用。 

4、FragmentActivity和Fragment组合使用,且使用多层Fragment组合(即Fragment内部有嵌套)。在底层Fragment中执行startActivityForResult方法后,Fragment的onActivityResult方法没有被调用。

我重载了FragmentActivity的onActivityResult方法,也增加了super.onActivityResult()。通过调试发现,FragmentActivity的onActivityResult方法执行了,但是没有往下传递成功。后来翻看源码:

FragmentActivity中的onActivityResult方法这样写的:

@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
int index = requestCode>>16;
if (index != 0) {
index--;
if (mFragments.mActive == null || index < 0 || index >= mFragments.mActive.size()) {
Log.w(TAG, "Activity result fragment index out of range: 0x"
+ Integer.toHexString(requestCode));
return;
}
Fragment frag = mFragments.mActive.get(index);
if (frag == null) {
Log.w(TAG, "Activity result no fragment exists for index: 0x"
+ Integer.toHexString(requestCode));
}
frag.onActivityResult(requestCode&0xffff, resultCode, data);
return;
}

super.onActivityResult(requestCode, resultCode, data);
}

 

转载于:https://www.cnblogs.com/bigben0123/p/4284590.html

文章来源:https://blog.csdn.net/weixin_30466421/article/details/98232771
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:https://dhexx.cn/news/show-16744.html

相关文章

基于HTML5 SVG炫酷文字爆炸特效

这是一款使用html5 svg、css3和js制作的炫酷文字爆炸特效。该文字特效用SVG path属性将文字路径切割为很多小块&#xff0c;然后使用css3和js在鼠标滑过文字时制作文字爆炸分裂的炫酷效果。 在线预览 源码下载 这是一款使用html5 svg、css3和js制作的炫酷文字爆炸特效。不论是…

vue foreach用法_手写简易版vue-router

源码地址&#xff1a;传送门vue-router是开发vue项目中必不可少的依赖&#xff0c;为了能更好的理解其实现原理&#xff0c;而源码阅读起来又过于复杂和枯燥&#xff0c;笔者这里实现一个简易版本的vue-rouer&#xff0c;帮助自己来更好的理解源码。其功能如下&#xff1a;通过…

Ecshop(二次开发) - 后台添加左侧菜单导航

1、链接地址&#xff1a;修改 admin\includes\inc_menu.php 文件。 $modules[17_syn_data][view_syn] synchronization_cat_data.php?actmain; 2、语言文字&#xff1a;修改 languages\zh_cn\admin\common.php 文件。 /* 菜单分类部分 */ $_LANG[17_syn_data] 数据…

linux 网页注入,Webmin Usermin远程命令注入漏洞(CVE-2014-3883)

发布日期&#xff1a;2014-06-20更新日期&#xff1a;2014-06-23受影响系统&#xff1a;Webmin Webmin < 1.690Webmin Webmin描述&#xff1a;--------------------------------------------------------------------------------BUGTRAQ ID: 68131CVE(CAN) ID: CVE-2014-3…

a标签的下划线怎么去掉_外链是什么,怎么做,外链建设15个最佳技巧

现在的搜索引擎&#xff0c;虽然已经可以处理各种样式的URL&#xff0c;但大家都知道&#xff0c;越简单的东西越容易被处理&#xff0c;搜索引擎也一样&#xff0c;在SEO工作中&#xff0c;外链建设是必不可少的&#xff0c;令人头痛并且至关重要的&#xff0c;下面给出外链建…

httpclient + TestNG 接口自动测试 第六章

1.httpclient处理post提交xml格式数据请求 public static void post(String HOST, String PATH, String reqXml) {// 创建httpClient实例CloseableHttpClient httpclient HttpClients.createDefault();// 创建httppostHttpPost httppost new HttpPost(getUrl(HOST, PATH));//…

[傅里叶变换及其应用学习笔记] 二. 周期性,三角函数表示复杂函数

这份是本人的学习笔记&#xff0c;课程为网易公开课上的斯坦福大学公开课&#xff1a;傅里叶变换及其应用。 这节课目的 如何用像$sin$&#xff0c;$cos$这些简单的函数来表示复杂周期函数。 信号周期化 并不是所有现象都是周期性的&#xff0c;而且即使是周期性的现象&#xf…

boost asio linux原理,BOOST.ASIO源码剖析(二) ---- 架构浅析

架构浅析先来看一下asio的0层的组件图。(图1.0)io_object是I/O对象的集合&#xff0c;其中包含大家所熟悉的socket、deadline_timer等对象&#xff0c;主要功能是提供接口给用户使用。services服务是逻辑功能的实现者&#xff0c;其中包含提供定时功能的deadline_timer_service…

3500个常用汉字表_中考语文常用汉字3500(一)你知道的有多少?

中考语文3500常用汉字七年级上课文篇目 需掌握的字 正确读音 课文篇目 需掌握的字 正确读音为你打开一扇门 憧憬 chōng jǐng 十三岁的际遇 白驹过隙 jū x 裨益 b 蓦然 m 广袤 mo 积攒 zǎn 跌宕 dng 安恬 tin 诠释 qun 樯橹 qing 真谛 d 惆怅 chuchng 繁星 半明半昧 mi 伟人…

Linux异常aborted定位方法,C++异常的几种捕获方式

捕获指定的类型这样的话可以对每种异常做出不同的处理&#xff0c;例如&#xff1a;#include using namespace std;void A(int n){int a 1;float b 0.2;double c 0.3;if(n 1)throw a;else if(n 2)throw b;else if(n 3)throw c;}int main(){int test;while(cin >> t…