使用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);
這是暫時我認為最有效,但是也是最笨的辦法。
各位博友,如果你有更好的解決方案,歡迎分享,謝謝。