Android java.lang.NoSuchFieldError: No static field xxx of type I in class Lcom/XX/R$id; or its superclasses

项目开发快到尾声,突然发现之前一个模块莫名其妙的奔溃了,我的内心也是奔溃的。以前一直都是好好的,也没去动过它,为啥会出现这样的问题呢? 下面我会根据自己的理解来看待问题

android是怎么根据id查找到控件的

首先,你在调用 findViewById 之前,你必然是在 activity 中设置了 setContentView, 或者在 Fragment 中重载了 onCreatedView 方法,对于 findViewById, 他只能使用在 view或者 activity 下,对于 view, 你进行遍历的根节点就是对应的 view, 对于 activity, 你对应的根节点就是你使用 setContentView 初始化的布局

当你调用 findViewById 是, android 先对比本身是否具有该 id,是则返回自己,不是则判断自己是否为 ViewGroup, 如果是再对子视图进行遍历,否则返回 null, 遍历时,按照从上到下的顺序一一遍历,只要找到一个节点的 id 为搜索的 id, 则返回这个节点代表的 view, 比如说你的 layout 中有两个相同 id 的 view, 那么返回的必然是最前的那一个

为什么会出现这样的情况

首先我们看看LOG日子

 java.lang.NoSuchFieldError: No static field tabTexts of type I in class Lcom/xxx/R$id; or its superclasses (declaration of ‘com.xxx.R$id‘ appears in /data/data/com.sss/files/instant-run/dex/slice-slice_1-classes.dex)

这是关键问题,这里告诉我们没有找到tabTexts 的字段(ID),奇怪了,我也没有碰过,为啥会突然出现这样的问题。我们可以从这方面入手查找问题。

解决问题

上面说到了,调用findViewById 时会对相应的layout进行遍历查找,如果没有则返回null。同样的NoSuchFieldError是Java反射中的一个异常,其表示无法通过反射找到需要的字段。进行到这里,我们该考虑了,是不是加载的时候,不是加载了相应的layout。导致找不到tabTexts 的ID控件。于是全局搜索一下layout的名字,终于在这里发现了弊端。我们来看看搜索结果:

这里我们可以发现,我滴天。怎么会有两个不同的ID,问题果然出现在这里。项目在加载layout的时候,默认加载了0x7f0d01c6的ID,导致找不到tabTexts 。这下好解决了。BUG哪里跑,看我还不消灭你。

解决办法: 
把custom_tab(就是报错的layout)换一个名字。避免android加载错误的layout.

时间: 2024-10-12 14:42:20

Android java.lang.NoSuchFieldError: No static field xxx of type I in class Lcom/XX/R$id; or its superclasses的相关文章

java.lang.NoSuchFieldError: No static field abc_ic_ab_back_mtrl_am_alpha of type I in class Landroid/support/v7/appcompat/R$drawable

出现java.lang.NoSuchFieldError: No static field abc_ic_ab_back_mtrl_am_alpha of type I in class Landroid/support/v7/appcompat/R$drawable问题, 通过网上查找问题,发现是由于v7包版本不一致,里面的abc_ic_ab_back_mtrl_am_alpha 文件有修改名称导致,所以将build.gradle文件中的依赖文件: compile 'com.android.s

Android Studo 使用 JNI报错:java.lang.UnsatisfiedLinkError: Couldn't load XXX from loader dalvik.system.PathClassLoader

今天在使用Android Studio的时候突然发现代码没错,so包也引入了,各个版本都引入了,但是就是一直报错: java.lang.UnsatisfiedLinkError: Couldn't load serphone from loader dalvik.system.PathClassLoader 11-30 11:13:18.766 29255-29255/com.personal.tai.ronglianim E/AndroidRuntime: at java.lang.Runti

java.lang.NoSuchMethodError: no static or non-static method 解决方法

最近在调试JNI的时候报了一个莫名其妙的错误,同一种类型的函数可以注册成功,不同类型的就会抛出一项异常: E AndroidRuntime: java.lang.NoSuchMethodError: no static or non-static method "Lcom/sprd/validationtools/phasecheckjni/PhaseCheckJNI;.eng_writephasecheck(III)I" E AndroidRuntime: at java.lang.

java.lang.NoSuchMethodError: No static method setLayoutDirection(Landroid/graphics/drawable/Drawable;I)V in class Landroid/support/v4/graphics/drawable/DrawableCompat

Bug: java.lang.NoSuchMethodError: No static method setLayoutDirection(Landroid/graphics/drawable/Drawable;I)V in class Landroid/support/v4/graphics/drawable/DrawableCompat; 然后出现了这个:java.lang.NoClassDefFoundError: android.support.v7.widget.RecyclerVie

Bug疑难杂症 - java.lang.NoSuchFieldError: udhLen

通过友盟后台记录到一个诡异的错误: HUAWEI C8825D 4.0.4 百度.谷歌都未能找到一丝结果更别提解决方案. java.lang.NoSuchFieldError: udhLen at android.text.TextUtils.obtain(TextUtils.java:1287) at android.text.BoringLayout.isBoring(BoringLayout.java:259) at android.widget.TextView.makeSingleLa

Java.lang.NoSuchFieldError: INSTANCE异常

解决方案: java.lang.NoSuchFieldError: INSTANCE异常. 1.jar包重复了. 2.版本还不相同,如果包的版本不同也会报相应的错,不过一般情况自己导入的jar包主要看导入有没有共同范围下有重复的jar. 仅供参考,大神高论,评论下方. Java.lang.NoSuchFieldError: INSTANCE异常

java.lang.NoSuchFieldError: VERSION_2_3_0 报错解决方案

java.lang.NoSuchFieldError: VERSION_2_3_0 at org.apache.struts2.views.freemarker.FreemarkerManager.createConfiguration(FreemarkerManager.java:331) at org.apache.struts2.views.freemarker.FreemarkerManager.init(FreemarkerManager.java:282) at org.apache

java.lang.NoSuchFieldError:INSTANCE

Java.lang.NoSuchFieldError: INSTANCE异常,可能是包重复了. 我遇到的情况是maven里引入了一个JAR,而我又在lib里面引入了这个jar,并且版本还不相同,就出了这个错.

遇到了问题了 java.lang.NoSuchFieldError:INSTANE

使用httpclient 出现各种错误,高版本低版本都试了,错误都一样,就是类不一样,我想知道这到底是怎么回事 搞了两三天了没解.大神们....给个思路啊...jar包冲突我也试了好多遍了都不行啊. Caused by: java.lang.NoSuchFieldError: INSTANCE    at org.apache.http.impl.io.DefaultHttpRequestWriterFactory.<init>(DefaultHttpRequestWriterFactory.