您的位置:首页 > Web前端

ButterKnife绑定控件报NullPointException

2017-03-20 16:04 344 查看
使用ButterKnife已经好久了,一直都是一路开绿灯,今天,突然之间就中奖了,或许我应该去买彩票的,咳咳咳,开玩笑。

不过今天确实遇到一个好奇葩的问题,明明控件已经初始化了,但是,在对控件进行操作的时候,部分控件返回的是null,宝宝很纳闷,该如何是好啊。先看看问题吧:

java.lang.RuntimeException: Unable to resume activity {com.dht.workunion/com.dht.union.ui.activity.flushBill.alipay.AliChartActivity}: java.lang.NullPointerException: Attempt to invoke virtual method 'void android.support.v7.widget.RecyclerView.setLayoutManager(android.support.v7.widget.RecyclerView$LayoutManager)' on a null object reference
at android.app.ActivityThread.performResumeActivity(ActivityThread.java:3314)
at android.app.ActivityThread.handleResumeActivity(ActivityThread.java:3345)
at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2659)
at android.app.ActivityThread.-wrap11(ActivityThread.java)
at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1488)
at android.os.Handler.dispatchMessage(Handler.java:111)
at android.os.Looper.loop(Looper.java:207)
at android.app.ActivityThread.main(ActivityThread.java:5728)
at java.lang.reflect.Method.invoke(Native Method)
at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:808)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:698)
Caused by: java.lang.NullPointerException: Attempt to invoke virtual method 'void android.support.v7.widget.RecyclerView.setLayoutManager(android.support.v7.widget.RecyclerView$LayoutManager)' on a null object reference
at com.dht.union.ui.activity.flushBill.alipay.AliChartActivity.initRecycleView(AliChartActivity.java:197)
at com.dht.union.ui.activity.flushBill.alipay.AliChartActivity.afterView(AliChartActivity.java:147)
at com.dht.union.ui.base.BaseActivity.onResume(BaseActivity.java:129)
at android.app.Instrumentation.callActivityOnResume(Instrumentation.java:1268)
at android.app.Activity.performResume(Activity.java:6540)
at android.app.ActivityThread.performResumeActivity(ActivityThread.java:3299)
... 10 more
java.lang.NullPointerException: Attempt to invoke virtual method 'void android.support.v7.widget.RecyclerView.setLayoutManager(android.support.v7.widget.RecyclerView$LayoutManager)' on a null object reference
at com.dht.union.ui.activity.flushBill.alipay.AliChartActivity.initRecycleView(AliChartActivity.java:197)
at com.dht.union.ui.activity.flushBill.alipay.AliChartActivity.afterView(AliChartActivity.java:147)
at com.dht.union.ui.base.BaseActivity.onResume(BaseActivity.java:129)
at android.app.Instrumentation.callActivityOnResume(Instrumentation.java:1268)
at android.app.Activity.performResume(Activity.java:6540)
at android.app.ActivityThread.performResumeActivity(ActivityThread.java:3299)
at android.app.ActivityThread.handleResumeActivity(ActivityThread.java:3345)
at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2659)
at android.app.ActivityThread.-wrap11(ActivityThread.java)
at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1488)
at android.os.Handler.dispatchMessage(Handler.java:111)
at android.os.Looper.loop(Looper.java:207)
at android.app.ActivityThread.main(ActivityThread.java:5728)
at java.lang.reflect.Method.invoke(Native Method)
at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:808)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:698)


在网上找了很多资料,大部分 都是把矛头指向依赖引入插件的过程(本人声明,引入插件没有问题),我也是依葫芦画瓢,结果越画越迷茫。

最后,无奈,我暂且只能用最为原始的办法将空间再次初始化一遍:

原代码:

//初始化控件
@BindView(R.id.flush_bill_recyclierview)
RecyclerView flush_bill_recyclierview; //聊天内容框

//操作控件
//创建线性布局
LinearLayoutManager mLayoutManager = new LinearLayoutManager(this);
//垂直方向
mLayoutManager.setOrientation(OrientationHelper.VERTICAL);
//给RecyclerView设置布局管理器
flush_bill_recyclierview.setLayoutManager(mLayoutManager);
//创建适配器
adapter = new FlushBillRecyclerAdapter(this, bitmapUtils, emojiUtils);
//绑定数据
flush_bill_recyclierview.setAdapter(adapter);


修改之后的代码(只是在操作控件前对控件进行判断):

//初始化控件
@BindView(R.id.flush_bill_recyclierview)
RecyclerView flush_bill_recyclierview; //聊天内容框

if (null == flush_bill_recyclierview) {
flush_bill_recyclierview = ButterKnife.findById(this, R.id.flush_bill_recyclierview);
}

//操作控件
//创建线性布局
LinearLayoutManager mLayoutManager = new LinearLayoutManager(this);
//垂直方向
mLayoutManager.setOrientation(OrientationHelper.VERTICAL);
//给RecyclerView设置布局管理器
flush_bill_recyclierview.setLayoutManager(mLayoutManager);
//创建适配器
adapter = new FlushBillRecyclerAdapter(this, bitmapUtils, emojiUtils);
//绑定数据
flush_bill_recyclierview.setAdapter(adapter);


这是暂时我认为最有效,但是也是最笨的办法。

各位博友,如果你有更好的解决方案,欢迎分享,谢谢。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: