android - 库使用了错误的 R 文件

标签 android android-studio android-gradle-plugin

我将一个库项目打包为 aar 文件,并通过 gradle 将其包含在不同的项目中。 现在看来,库项目使用了错误的 R 文件,导致 NullPointerExceptions。

库项目(打包为aar):

  • 一些 fragment

    public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
       View v = new View(getActivity());
       v = inflater.inflate(R.layout.fragment_some, container, false);
    }
    

我的项目

  • MyFragment 扩展了 SomeFragment

    @Override
    public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
    L.d("ExtendedFragment - onCreateView");
    
    return super.onCreateView(inflater, container, savedInstanceState);
    }
    

R 值:

  • build/generated/source/r/debug/com.example.myapp/R.java - fragment_some=0x7f030005;
  • build/generated/source/r/test/debug/com/example/mylibrary/R.java - fragment_some=0x7f030005;
  • build/intermediates/exploded-aar/com.example/mylibrary/version/R.txt - fragment_some 0x7f030000

在调试时我意识到在库中 R.txt 文件的 Id 被传递给了 Inflater。问题是 Inflater 使用上面提到的 R.java 来解析资源,得到错误的资源并膨胀,因此错误的布局导致以下异常。

这种行为的原因可能是什么?

  • R.txt 文件是否生成错误? R.txt 文件有什么用途?
  • 我是否必须在代码中的某处设置上下文或 R 文件?
  • 或者它可能在项目的构建脚本中,它可能没有正确地包含库?

2014 年 10 月更新

我还找不到解决方案,但我将 libraryproject 作为模块直接包含到我的项目中,一切正常。所以 gradle 如何解析 aar 文件似乎是个问题。

最佳答案

步骤

  1. 清理您的项目并再次构建
  2. 检查R.java文件是否生成 如果未生成 R.java,则您的项目很可能在 xml 文件
  3. 中存在错误
  4. 从imports中找出R.java被导入的是import android.R还是import android.projectName.R。所以正确的是import android.projectName.R。 Android 会自动执行此操作,但有时您必须手动执行此操作

关于android - 库使用了错误的 R 文件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26357722/

相关文章:

java - 操纵 Android 屏幕颜色 RGB

android - 如何使用 ABC 顺序的方法创建 JavaDoc

Android studio - 生成已签名的 APK 失败

android - 无法使用 Android Studio 1.2 和 Gradle 1.2.2 加载类 OutputFileTask

android - 与 android 支持库的依赖关系不适用于使用 Androidx 的项目

android - 可以在 UI 线程上查询 DownloadManager 吗?

android - SharedPreferences 返回 null,即使它具有默认值

android - Gradle 升级 - 创建 apk 时缺少 base.apk 代码

java - Android检查多个字符串是否不为空

android - 触发 Android Studio 以显示方法签名?