我将库项目打包为aar-file,并通过gradle将其包含在不同的项目中。 现在,似乎库项目使用了错误的R文件,导致NullPointerExceptions。
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);
}
fragment_some=0x7f030005;
fragment_some=0x7f030005;
fragment_some 0x7f030000
调试时我意识到在库中,R.txt文件的Id被传递给Inflater。问题是Inflater使用上面提到的R.java来解析资源,获取错误的资源并因此导致错误的布局,导致异常。
我找不到解决方案,但我将libraryproject作为模块直接包含在我的项目中,并且每件事都可以正常工作。因此,gradle如何解析aar文件似乎是一个问题。
答案 0 :(得分:2)
Clean
您的项目,再次build
R.java
文件
如果未生成R.java
,则您的项目中可能存在错误,很可能是xml file
R.java
导入的导入中找出import android.R
或import android.projectName.R
。所以正确的是import android.projectName.R
。 Android会自动执行此操作,但有时您必须手动执行此操作答案 1 :(得分:0)
资源需要进行唯一命名/识别。如果要覆盖以前定义的资源,这实际上是一种方便。例如,您希望更改库中存在的布局,并在应用程序中实现它时对其进行自定义。就像为“搜索”创建库一样,您希望在多个项目中使用该库,并使用自定义图标或更改背景颜色来更改外观。您可以创建具有相同名称的图标,这些图标将在构建项目时使用。
为了避免这种情况,您需要在当前项目中唯一地命名资源。
顺便说一句,这也意味着如果您构建一个用于一般分发的库,您应该确保创建不太可能与开发人员选择的资源名称冲突的资源名称。
特别是,您有一个名为fragment_some
的资源被赋予相同的参考值0x7f030005
- 这会创建一个通过引用最近创建的R文件解决的冲突。
答案 2 :(得分:0)
检查导入你必须错误导入android.R而不是com.yourproject.R