库正在使用错误的R文件

时间:2014-10-14 09:50:28

标签: android android-studio android-gradle

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

图书馆计划(打包为aar):

  • SomeFragment

    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 / explosion-aar / com.example / mylibrary / version / R.txt - fragment_some 0x7f030000

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

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

  • 是否错误地生成了R.txt文件? R.txt文件有什么用途?
  • 我是否必须在代码中的某处设置Context或R文件?
  • 或者它可能在项目的构建脚本中,它可能不包含lib相关吗?

更新20.10.2014

我找不到解决方案,但我将libraryproject作为模块直接包含在我的项目中,并且每件事都可以正常工作。因此,gradle如何解析aar文件似乎是一个问题。

3 个答案:

答案 0 :(得分:2)

步骤

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

答案 1 :(得分:0)

资源需要进行唯一命名/识别。如果要覆盖以前定义的资源,这实际上是一种方便。例如,您希望更改库中存在的布局,并在应用程序中实现它时对其进行自定义。就像为“搜索”创建库一样,您希望在多个项目中使用该库,并使用自定义图标或更改背景颜色来更改外观。您可以创建具有相同名称的图标,这些图标将在构建项目时使用。

为了避免这种情况,您需要在当前项目中唯一地命名资源。

顺便说一句,这也意味着如果您构建一个用于一般分发的库,您应该确保创建不太可能与开发人员选择的资源名称冲突的资源名称。

特别是,您有一个名为fragment_some的资源被赋予相同的参考值0x7f030005 - 这会创建一个通过引用最近创建的R文件解决的冲突。

答案 2 :(得分:0)

检查导入你必须错误导入android.R而不是com.yourproject.R