開發之中遇到:java
Android java.lang.NoSuchFieldError: No static field xxx of type I in class Lcom/XX/R$id; or its superclasses
仔細查找對應ID後,確認對應ID和頁面並無問題,全局搜索發現有同名的layout文件在不一樣的module下,可是各用各的,正常來講並不會有什麼問題。android
根據仔細搜索及排查,從下面瞭解這個問題:app
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, 那麼返回的必然是最前的那一個spa
爲何會出現這樣的狀況
首先咱們看看LOGcode
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),奇怪了,我也沒有碰過,爲啥會忽然出現這樣的問題。咱們能夠從這方面入手查找問題。blog
解決問題
上面說到了,調用findViewById 時會對相應的layout進行遍歷查找,若是沒有則返回null。一樣的NoSuchFieldError是Java反射中的一個異常,其表示沒法經過反射找到須要的字段。進行到這裏,咱們該考慮了,是否是加載的時候,不是加載了相應的layout。致使找不到tabTexts 的ID控件。因而全局搜索一下layout的名字,終於在這裏發現了弊端。咱們來看看搜索結果:開發
兩個同名但不一樣的ID,問題果真出如今這裏。it
項目在加載layout的時候,默認加載了0x7f0d01c6的ID,致使找不到tabTexts 。io
解決辦法:
custom_tab(就是報錯的layout)換一個名字。避免android加載錯誤的layout.
by: yzl