片段兼容性 onActivityResult() 不起作用

6

我一直在开发一个使用 Android 兼容性库 (android-support-v4)的 Android 应用程序。在 SDK 20 之前,我可以在应用程序清单中使用以下的uses-sdk 条目进行编译。

<uses-sdk android:minSdkVersion="7" />  

我所有启动带有结果的活动的片段都能正确接收它们的结果。

有一天(在我更新到SDK 20之前),我正在修复lint问题,并根据lint标志的请求添加了android:targetSdkVersion到清单中,很快我意识到我的所有片段都没有接收到它们的onActivityResult()调用。

现在,自从我更新到SDK 20.0.1以来,我被迫在清单中的uses-sdk条目中使用android:targetSdkVersion;否则R.java将永远不会生成。

这是我当前的uses-sdk清单条目:

<uses-sdk
    android:minSdkVersion="7"
    android:targetSdkVersion="16" />

目前由于这个奇怪的 bug,我的应用仍然无法正常运行。 我已经尝试更新兼容性库到最新版本 r9。

此外,我已经仔细检查了所有片段中的 startActivityForResult() 调用。它们都通过片段的方法正确调用。

例如:

 this.startActivityForResult(intent, requestCode);

 this.getActivity().startActivityForResult(intent, requestCode);

我的当前开发环境:

Android SDK 20.0.1
Android SDK Platform Tools 13
ADT 20.0.2

任何帮助都将不胜感激,因为这个错误目前是阻止我的最终测试的瓶颈。
编辑
这是我的ant debug输出。
运行命令“ant debug”
构建文件:
/home/ricky/Development/workspace/location_ringer/LocationRinger/build.xml
-set-mode-check:
-set-debug-files:
检查环境:
Android SDK工具修订版20.0.1
已安装于/app/android-sdk-linux_86
设置:
项目名称:ListActivity
项目类型:应用程序
设置调试模式:
检查调试混淆:
构建设置:
解析ListActivity的构建目标...
项目目标:Google APIs
供应商:Google Inc.
平台版本:4.1
API级别:16
创建必要的输出目录...
解决ListActivity的依赖项...
库依赖项:
无库依赖项
API<=15:将annotations.jar添加到类路径中。
使用“debug”构建库...
nodeps:
-set-mode-check:
-set-debug-files:
检查环境:
Android SDK工具修订版20.0.1
已安装于/app/android-sdk-linux_86
设置:
项目名称:LocationLib
项目类型:Android库
设置调试模式:
检查调试混淆:
构建设置:
解析LocationLib的构建目标...
项目目标:Google APIs
供应商:Google Inc.
平台版本:4.1
API级别:16
创建必要的输出目录...
解决LocationLib的依赖项...
库依赖项:
无库依赖项
API<=15:将annotations.jar添加到类路径中。
预编译:
创建资源文件夹的库输出jar文件...
处理aidl文件...
没有AIDL文件需要编译。
处理RenderScript文件...
没有RenderScript文件需要编译。
处理资源...
未更改的资源。R.java和Manifest.java未变动。
处理BuildConfig类...
不需要生成新的BuildConfig。
编译:
使用“debug”构建库...
-Ddex.force.jumbo=true-源1.6-目标1.6 --output /home/ricky/Development/workspace/location_library/LocationLib/bin/classes.dex /home/ricky/Development/workspace/location_library/LocationLib/bin/classes /home/ricky/Development/workspace/location_library/LocationLib/libs/guava-r09.jar /home/ricky/Development/workspace/location_library/LocationLib/libs/android-support-v4.jar /home/ricky/Development/workspace/location_library/LocationLib/libs/ormlite-android-4.47.jar /home/ricky/Development/workspace/location_library/LocationLib/libs/ormlite-core-4.47.jar /home/ricky/Development/workspace/location_library/LocationLib/libs/appcompat_v7.jar /app/android-sdk-linux_86/platforms/android-16/android.jar /home/ricky/Development/workspace/location_library/LocationLib/libs/slf4j-android-1.5.8.jar /home/ricky/Development/workspace/location_library/LocationLib/libs/slf4j-api-1.5.8.jar
处理库项目:
不要转换字节码...
压缩PNG文件...
将PNG文件压缩到目录/home/ricky/Development/workspace/location_library/LocationLib/bin/res中,以更新缓存。
打包资源:库项目不需要打包资源...
创建apk:库项目不需要创建apk...
调试:
创建apk:库项目不需要创建apk...
-debug-obfuscation-check:
-set-mode-check:
-set-debug-files:
检查环境:
Android SDK工具修订版20.0.1
已安装于/app/android-sdk-linux_86
设置:
项目名称:ExceptionHandlerLib
项目类型:Android库
设置调试模式:
检查调试混淆:
构建设置:
解析ExceptionHandlerLib的构建目标...
项目目标:Android 4.1

编辑

我查看了/app/android-sdk-linux_86/tools/ant/build.xml:616并发现以下行抛出了null enabled="${manifestmerger.enabled}">

这是整个代码块:

我将尝试禁用合并清单选项,看看会发生什么。

编辑

移除project.properties中的manifestmerger.enabled=true似乎解决了我的问题。 该项目现在可以编译并正常工作。 我认为我应该向Android团队报告此错误。 我的清单具有以下条目

<uses-sdk android:minSdkVersion="7"  />

然而,如果我将targetSdkVersion提高到7以上,onActivityResult()仍然不会被调用,所以这并没有真正解决根本问题,但是我的项目现在可以正常工作了。


你使用的是支持库的哪个版本?v9修复了一些在onActivityResult(..)中显现的错误。 - Alex Curran
我正在使用android-support-v4 r9。 - Rick Barrette
你试过使用 android:targetSdkVersion="7" 吗? - pawelzieba
尝试使用android:minSdkVersion="8"。 - Pointer Null
如果你在fragment中这样调用startActivityForResult(intent, requestCode);并且你还重写了fragment的父类中的OnActivityResult方法,那么结果将会在父类的onActivityResult方法中接收到。为此,你应该这样调用getActivity().startActivityForResult(intent, requestCode); - Krishna Shrestha
显示剩余3条评论
5个回答

7
在Fragment中(错误的startActivityForResult)
getActivty().startActivityForResult(intent, requestCode); 
// Cannot receive in fragment

在Fragment中 (正确的 startActivityForResult)

startActivityForResult(intent, requestCode); 
// use Fragment.startActivityForRusult()
// not Activity.startActivityForRusult()

在活动中

@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
    super.onActivityResult(requestCode, resultCode, data);
}

在Fragment中

@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
    // Do Action
}

2

以下是几个建议:

  • 如果您只想不在清单文件中使用android:targetSdkVersion,则应该能够在Eclipse的项目浏览器中右键单击您的项目,并选择Android工具 > 清除 Lint标记

  • 请检查所有派生自FragmentActivity类是否都从兼容库中正确扩展了相应的类(android.support.v4.app.Fragmentandroid.support.v4.app.FragmentActivity),并且没有错误地扩展框架中的类(android.app.Fragmentandroid.app.Activity)。

此外,如果将targetSdkVersion设置为任何其他版本时,您的项目不能编译通过,我认为很奇怪。请检查问题/控制台/Lint窗口中是否有任何特定问题指示?还请检查您是否有其他可用目标和/或已选中作为项目构建目标(右键单击项目,属性 > Android)。


我已经仔细检查过我的应用程序是否使用了android.support.v4.app.*。此外,我尝试删除'targetSdkVersion'并清除lint标记,但没有成功。 - Rick Barrette
真正奇怪的是,为什么没有关于R.java未生成的错误消息。至于我上面的评论,我尝试在“属性> Android”下更改API构建目标,但没有成功。 - Rick Barrette
1
这很奇怪。我想知道你是否想尝试一下,看看从命令行构建会不会出现任何错误信息。如果你以前没有尝试过,通常只需要在命令提示符下进入项目文件夹,然后运行 android update project -p .(初始化 local.properties 和 build.xml 文件),然后运行 ant debug(进行构建)。 - Joe
我已经更新了问题并附上了输出,我将查看android-sdk-linux_86/tools/ant/build.xml:616。 - Rick Barrette
Joseph,请写下我们的工作答案,我会将其选为被接受的答案。再次感谢你的所有帮助。 - Rick Barrette
显示剩余5条评论

0

在下载最新的ADT之后,确保你也用这个覆盖你项目中的support jar文件:

android-sdk\extras\android\support\v4\android-support-v4.jar

如果您在运行最新的ADT时使用了旧的jar包,则可能会出现问题。

否则,我只会预期如果父Activity没有调用super.onActivityResult(requestCode, resultCode, data);,则您的Fragments将不会收到它们的onActivityResult()调用。

编辑

对于我的项目,明确添加这一点是必要的:

@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
    Fragment fragment = getSupportFragmentManager().findFragmentById(R.id.dualPane);
    fragment.onActivityResult(requestCode, resultCode, data);
}

是的,我已经验证过我拥有最新版本。这个错误存在于r7和r9中。 - Rick Barrette
你说:“当我将目标版本更改为除16以外的任何版本时,我的项目无法编译。” 当你降低目标版本时,你遇到了什么问题?这意味着你在项目中使用了比你想象中更高级别的API。 - Graeme

0

看起来从project.properties中删除manifestmerger.enabled=true解决了我的问题。现在项目编译并且正常运行。我认为我应该向Android团队报告此错误。我的清单文件具有以下条目

<uses-sdk android:minSdkVersion="7"  />

然而,如果我将targetSdkVersion提高到7以上,onActivityResult()仍然不会被调用,因此这并没有真正解决根本问题,但是我的项目现在可以正常工作了。


0

兼容性包中存在一个错误(请参见thisthis


我知道那个 bug,但是在 r9 发布时已经修复了。我已经检查过,确保 onActivityResult() 没有在片段活动中调用。 - Rick Barrette

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接