Android @BindView时报Required view ID was not found 异常

最近,在做公司客制化项目的时候遇到一个问题:有些layout下面的xml布局文件需要进行动态的加载,而我使用的是ButterKnife去绑定的view,而且在类的全局变量中已经声明好了,如下所示:

@BindView(R.id.ll_display_a)
LinearLayout llDisplayA;
@BindView(R.id.ll_display_b)
LinearLayout llDisplayB;

上面两个布局在不同的场景下加载,因此对应的layout布局也不同(llDisplayA对应的是布局layout_a.xml,llDisplayB对应的是布局layout_b.xml),而Butterknife并没有这么智能,只要是需要加载的view,都可以通过@BindView的注解形式进行初始化,点击事件也可通过
layout_a.xml,而Butterknife并没有这么智能,只要是需要加载的view,都可以通过@BindView的注解形式进行初始化,以及点击事件通过@onViewCliked的形式指定。那么问题来了,如果我只初始化了layout_a.xml,而变量 llDisplayB在类中已经声明,运行程序之后会报错,报错如下:

12-13 11:55:56.187  4158  4158 E AndroidRuntime: java.lang.IllegalStateException: Required view 'll_display_b' with ID 2131558712 for method 'onViewClicked' was not found. If this view is optional add '@Nullable' (fields) or '@Optional' (methods) annotation.
12-13 11:55:56.187  4158  4158 E AndroidRuntime: 	at butterknife.internal.Utils.findRequiredView(Utils.java:92)
12-13 11:55:56.187  4158  4158 E AndroidRuntime: 	at com.xbh.systemsetting.advancedsetting.view.AdvancedFragment_ViewBinding.<init>(AdvancedFragment_ViewBinding.java:322)
12-13 11:55:56.187  4158  4158 E AndroidRuntime: 	at java.lang.reflect.Constructor.newInstance(Native Method)
12-13 11:55:56.187  4158  4158 E AndroidRuntime: 	at butterknife.ButterKnife.createBinding(ButterKnife.java:199)
12-13 11:55:56.187  4158  4158 E AndroidRuntime: 	at butterknife.ButterKnife.bind(ButterKnife.java:172)
12-13 11:55:56.187  4158  4158 E AndroidRuntime: 	at com.xbh.systemsetting.advancedsetting.view.AdvancedFragment.initView(AdvancedFragment.java:765)
12-13 11:55:56.187  4158  4158 E AndroidRuntime: 	at com.xbh.systemsetting.advancedsetting.view.AdvancedFragment.onCreateView(AdvancedFragment.java:299)
12-13 11:55:56.187  4158  4158 E AndroidRuntime: 	at android.support.v4.app.Fragment.performCreateView(Fragment.java:2192)
12-13 11:55:56.187  4158  4158 E AndroidRuntime: 	at android.support.v4.app.FragmentManagerImpl.moveToState(FragmentManager.java:1299)
12-13 11:55:56.187  4158  4158 E AndroidRuntime: 	at android.support.v4.app.FragmentManagerImpl.moveFragmentToExpectedState(FragmentManager.java:1528)
12-13 11:55:56.187  4158  4158 E AndroidRuntime: 	at android.support.v4.app.FragmentManagerImpl.moveToState(FragmentManager.java:1595)
12-13 11:55:56.187  4158  4158 E AndroidRuntime: 	at android.support.v4.app.BackStackRecord.executeOps(BackStackRecord.java:758)
12-13 11:55:56.187  4158  4158 E AndroidRuntime: 	at android.support.v4.app.FragmentManagerImpl.executeOps(FragmentManager.java:2363)
12-13 11:55:56.187  4158  4158 E AndroidRuntime: 	at android.support.v4.app.FragmentManagerImpl.executeOpsTogether(FragmentManager.java:2149)
12-13 11:55:56.187  4158  4158 E AndroidRuntime: 	at android.support.v4.app.FragmentManagerImpl.optimizeAndExecuteOps(FragmentManager.java:2103)
12-13 11:55:56.187  4158  4158 E AndroidRuntime: 	at android.support.v4.app.FragmentManagerImpl.execSingleAction(FragmentManager.java:1984)
12-13 11:55:56.187  4158  4158 E AndroidRuntime: 	at android.support.v4.app.BackStackRecord.commitNowAllowingStateLoss(BackStackRecord.java:626)
12-13 11:55:56.187  4158  4158 E AndroidRuntime: 	at android.support.v4.app.FragmentPagerAdapter.finishUpdate(FragmentPagerAdapter.java:143)
12-13 11:55:56.187  4158  4158 E AndroidRuntime: 	at android.support.v4.view.ViewPager.populate(ViewPager.java:1268)
12-13 11:55:56.187  4158  4158 E AndroidRuntime: 	at android.support.v4.view.ViewPager.populate(ViewPager.java:1116)
12-13 11:55:56.187  4158  4158 E AndroidRuntime: 	at android.support.v4.view.ViewPager.onMeasure(ViewPager.java:1642)
12-13 11:55:56.187  4158  4158 E AndroidRuntime: 	at android.view.View.measure(View.java:18788)
12-13 11:55:56.187  4158  4158 E AndroidRuntime: 	at android.view.ViewGroup.measureChildWithMargins(ViewGroup.java:5951)
12-13 11:55:56.187  4158  4158 E AndroidRuntime: 	at android.widget.LinearLayout.measureChildBeforeLayout(LinearLayout.java:1465)
12-13 11:55:56.187  4158  4158 E AndroidRuntime: 	at android.widget.LinearLayout.measureVertical(LinearLayout.java:748)
12-13 11:55:56.187  4158  4158 E AndroidRuntime: 	at android.widget.LinearLayout.onMeasure(LinearLayout.java:630)
12-13 11:55:56.187  4158  4158 E AndroidRuntime: 	at android.view.View.measure(View.java:18788)
12-13 11:55:56.187  4158  4158 E AndroidRuntime: 	at android.view.ViewGroup.measureChildWithMargins(ViewGroup.java:5951)
12-13 11:55:56.187  4158  4158 E AndroidRuntime: 	at android.widget.LinearLayout.measureChildBeforeLayout(LinearLayout.java:1465)
12-13 11:55:56.187  4158  4158 E AndroidRuntime: 	at android.widget.LinearLayout.measureHorizontal(LinearLayout.java:1112)
12-13 11:55:56.187  4158  4158 E AndroidRuntime: 	at android.widget.LinearLayout.onMeasure(LinearLayout.java:632)
12-13 11:55:56.187  4158  4158 E AndroidRuntime: 	at android.view.View.measure(View.java:18788)
12-13 11:55:56.187  4158  4158 E AndroidRuntime: 	at android.view.ViewGroup.measureChildWithMargins(ViewGroup.java:5951)
12-13 11:55:56.187  4158  4158 E AndroidRuntime: 	at android.widget.LinearLayout.measureChildBeforeLayout(LinearLayout.java:1465)
12-13 11:55:56.187  4158  4158 E AndroidRuntime: 	at android.widget.LinearLayout.measureHorizontal(LinearLayout.java:1112)
12-13 11:55:56.187  4158  4158 E AndroidRuntime: 	at android.widget.LinearLayout.onMeasure(LinearLayout.java:632)
12-13 11:55:56.187  4158  4158 E AndroidRuntime: 	at android.view.View.measure(View.java:18788)
12-13 11:55:56.187  4158  4158 E AndroidRuntime: 	at android.view.ViewGroup.measureChildWithMargins(ViewGroup.java:5951)
12-13 11:55:56.187  4158  4158 E AndroidRuntime: 	at android.widget.FrameLayout.onMeasure(FrameLayout.java:194)
12-13 11:55:56.187  4158  4158 E AndroidRuntime: 	at android.view.View.measure(View.java:18788)
12-13 11:55:56.187  4158  4158 E AndroidRuntime: 	at android.view.ViewGroup.measureChildWithMargins(ViewGroup.java:5951)
12-13 11:55:56.187  4158  4158 E AndroidRuntime: 	at android.widget.LinearLayout.measureChildBeforeLayout(LinearLayout.java:1465)
12-13 11:55:56.187  4158  4158 E AndroidRuntime: 	at android.widget.LinearLayout.measureVertical(LinearLayout.java:748)
12-13 11:55:56.187  4158  4158 E AndroidRuntime: 	at android.widget.LinearLayout.onMeasure(LinearLayout.java:630)
12-13 11:55:56.187  4158  4158 E AndroidRuntime: 	at android.view.View.measure(View.java:1[  179.092576] init: Service 'cpudvfsscaling' is being killed...
8788)

查看打印信息,发现Required view ID was not found ,说有一个id为ll_display_b的view未找到。紧接着,我注意到了后面一句话:

If this view is optional add '@Nullable' (fields) or '@Optional' (methods) annotation.
它说如果这个view是可选的,那么可以加上@Nullable(变量)或者@Optional(方法)注解。这时我才发现这才是解决问题的关键所在,而且ButterKnife也确实考虑到了这一点。于是我在成员变量的 @BindView注解上面加上了 @Nullable,在点击事件@onViewCliked上加上了@Optional注解:
//必须加上@Nullable注解,这样即使控件id不存在,也不会报空指针异常
@Nullable
@BindView(R.id.ll_display)
LinearLayout llDisplay;
//必须加上@Optional注解,这样即使控件id不存在,也不会报空指针异常
@Optional
@OnClick({R.id.ll_display_b})
public void onViewClicked(View view) {}
问题完美解决!






  • 2
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值