您的位置:首页 > 移动开发 > Android开发

一个ButterKnife引起的bug-android.content.res.Resources$NotFoundException

2017-04-08 14:50 826 查看
做项目的时候遇到了一个奇异的bug,折腾了一大轮,虽然成因还是不确定,但终究是解决了。

情况是这样的,有一个列表需要显示,我用fragment对它进行显示,继承的是我封装的一个专门用来显示列表的BaseListFragment(这个封装里面是有使用到ButterKnife绑定的),它有一个addHeader()的方法,我可以addHeader进去。创建这个view之后我使用ButterKnife对这个view进行绑定,就像这样:



需要说明的是,我这个header是一个用于返回的标题栏,有一个几乎一模一样的标题栏已经存在在装载这个fragment的activity里,我仅仅是把这个标题栏的代码复制过来,调整了一下里面的东西,id什么的都没变。一切看起来都很美好,但是运行起来就炸掉了。

FATAL EXCEPTION: main
Process: com.w***e.suppliers, PID: 765
java.lang.RuntimeException: Unable to resume activity {com.w***e.suppliers/com.w***e.suppliers.base.activity.SingleFragmentActivity}: android.content.res.Resources$NotFoundException: Unable to find resource ID #0x7f0e0320
at android.app.ActivityThread.performResumeActivity(ActivityThread.java:2799)
at android.app.ActivityThread.handleResumeActivity(ActivityThread.java:2828)
at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2263)
at android.app.ActivityThread.access$800(ActivityThread.java:147)
at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1211)
at android.os.Handler.dispatchMessage(Handler.java:102)
at android.os.Looper.loop(Looper.java:136)
at android.app.ActivityThread.main(ActivityThread.java:5135)
at java.lang.reflect.Method.invokeNative(Native Method)
at java.lang.reflect.Method.invoke(Method.java:515)
at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:798)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:614)
at dalvik.system.NativeStart.main(Native Method)
Caused by: android.content.res.Resources$NotFoundException: Unable to find resource ID #0x7f0e0320
at android.content.res.Resources.getResourceEntryName(Resources.java:1879)
at butterknife.internal.Utils.getResourceEntryName(Utils.java:190)
at butterknife.internal.Utils.findRequiredView(Utils.java:137)
at com.w***e.suppliers.app.***ch.stockout.view.StockoutFragment_ViewBinding.<init>(StockoutFragment_ViewBinding.java:24)
at java.lang.reflect.Constructor.constructNative(Native Method)
at java.lang.reflect.Constructor.newInstance(Constructor.java:423)
at com.zeroturnaround.jrebel.android.runtime.reload.runtime.reflection.ReflectionConstructorHelper.newInstance(SourceFile:141)
at butterknife.ButterKnife.createBinding(ButterKnife.java:199)
at butterknife.ButterKnife.bind(ButterKnife.java:172)
at com.w***e.suppliers.base.fragment.BaseFragment.onCreateView(BaseFragment.java:79)
at android.support.v4.app.Fragment.performCreateView(Fragment.java:2184)
at android.support.v4.app.FragmentManagerImpl.moveToState(FragmentManager.java:1298)
at android.support.v4.app.FragmentManagerImpl.moveFragmentsToInvisible(FragmentManager.java:2323)
at android.support.v4.app.FragmentManagerImpl.executeOpsTogether(FragmentManager.java:2136)
at android.support.v4.app.FragmentManagerImpl.optimizeAndExecuteOps(FragmentManager.java:2092)
at android.support.v4.app.FragmentManagerImpl.execPendingActions(FragmentManager.java:1998)
at android.support.v4.app.FragmentController.execPendingActions(FragmentController.java:388)
at android.support.v4.app.FragmentActivity.onResume(FragmentActivity.java:488)
at nucleus.view.NucleusAppCompatActivity.onResume(NucleusAppCompatActivity.java:69)
at com.w***e.suppliers.base.activity.BaseActivity.onResume(BaseActivity.java:93)
at android.app.Instrumentation.callActivityOnResume(Instrumentation.java:1192)
at cn.jiguang.a.a.c.a.a.d.callActivityOnResume(Unknown Source)
at android.app.Activity.performResume(Activity.java:5435)
at android.app.ActivityThread.performResumeActivity(ActivityThread.java:2789)
at android.app.ActivityThread.handleResumeActivity(ActivityThread.java:2828)
at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2263)
at android.app.ActivityThread.access$800(ActivityThread.java:147)
at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1211)
at android.os.Handler.dispatchMessage(Handler.java:102)
at android.os.Looper.loop(Looper.java:136)
at android.app.ActivityThread.main(ActivityThread.java:5135)
at java.lang.reflect.Method.invokeNative(Native Method)
at java.lang.reflect.Method.invoke(Method.java:515)
at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:798)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:614)
at dalvik.system.NativeStart.main(Native Method)

如上,找不到id了,我做了一堆排查,这个id是我添加的这个HeaderView里面的一个id,找到id之后看起来一切都结束了是不?Nonono...即使我把整个fragment的代码都删除掉了(这个实现类并不需要多少行代码,所以删起来很轻松),并且不再使用butterknife进行绑定,仍然是报这样的异常,无数次的clear、rebuild,都没有改变。

我重新建了一个fragment,把代码一点点搬过去,到了复制绑定的代码,又出现了同样的问题,我不想又新建一个fragment了。找到日志中的重点,就是那个butterknife生成的那个类:XXX_ViewBinding。它看起来是这样的:



就是里面这个id没有找到,删掉里面两行关于这个id的代码并没有起到作用,它仍然在下一次的代码构建中重新生成了。那我就想把这个生成的类删除掉,使用eventthing搜索到两条结果:





第一条结果是编译出来的,无法删掉,而第二条结果可以手动删除,删除第二条结果之后对项目rebuild一下,会发现第一条结果被清理掉了,重新运行这个fragment,完美运行,bug终于解决了。

8bc9
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  ButterKnife Android
相关文章推荐