问题描述
java.lang.NoSuchFieldError: No static field xxx of type I in class Lcom/XX/R$id; or its superclasses
问题分析
首先,在调用 findViewById 之前,必然是在 activity 中设置了setContentView,或者在 Fragment 中重载了onCreatedView 方法,加载了相应的布局文件。对于 activity,findViewById遍历的根节点就是 setContentView 初始化的布局。
安卓在调用findViewById 时会对相应的layout进行遍历查找,如果没有则返回null。同样的NoSuchFieldError是Java反射中的一个异常,其表示无法通过反射找到需要的字段。
那么在布局文件存在,并且包含了所要findViewById的组建的情况下,为什么会报NoSuchFieldError呢?因为一个安卓项目可能包含多个module,在不同的module中可能包含相同名字的布局文件,这种情况下,通过setContentView加载的布局很有可能不是本身module内的布局。
解决方法
多个module的项目中,不应出现多个相同名称的布局文件,有的话重命名一下。可以在给资源文件命名时拼上module名方便查找及区分。