我将一个库项目打包为 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 文件似乎是个问题。
最佳答案
步骤
清理
您的项目并再次构建
- 检查
R.java
文件是否生成 如果未生成R.java
,则您的项目很可能在xml 文件
中存在错误
- 从imports中找出
R.java
被导入的是import android.R
还是import android.projectName.R
。所以正确的是import android.projectName.R
。 Android 会自动执行此操作,但有时您必须手动执行此操作
关于android - 库使用了错误的 R 文件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26357722/