拆分项目为模块后ButterKnife无法绑定视图,开启调试仍异常
ButterKnife绑定视图为null,无法找到当前类Binding的解决方案
先还原一下你的问题场景:
已经开启了
ButterKnife.setDebug(BuildConfig.DEBUG),之前运行正常的WelcomeActivity,现在调用ButterKnife.bind(this)后所有视图还是null。查看Debug日志发现:16401-16401 D/ButterKnife: Looking up binding for com.mobile.myapp.presentation.view.controllers.login.activities.WelcomeActivity 16401-16401 D/ButterKnife: Not found. Trying superclass com.mobile.myapp.presentation.view.base.myappBaseMvp...
下面是几个大概率能解决问题的排查方向,都是实际开发中踩过的坑:
1. 先确认注解处理器有没有正常干活
ButterKnife是靠编译时注解处理器生成XXX_ViewBinding类的,如果这个类没生成,肯定找不到绑定。
- 先检查Module级别的
build.gradle,确保依赖和注解处理器都配对了(版本要对应):dependencies { implementation 'com.jakewharton:butterknife:10.2.3' // 换成你实际用的版本 annotationProcessor 'com.jakewharton:butterknife-compiler:10.2.3' } - 然后执行Clean Project → Rebuild Project,强制清空缓存重新生成Binding类。有时候Android Studio的缓存会抽风,导致注解处理器偷懒不生成文件。
2. 检查当前Activity的注解和调用顺序
- 确保你在
WelcomeActivity里的视图都正确加了@BindView注解,而且ID和布局文件里的完全对应:public class WelcomeActivity extends myappBaseMvp { @BindView(R.id.btn_welcome_login) Button loginBtn; // ID必须和布局里的一致 @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_welcome); // 必须先加载布局! ButterKnife.bind(this); // 再绑定,顺序不能反 // 之后才能用loginBtn } } - 重点提醒:
setContentView一定要在ButterKnife.bind之前调用,不然ButterKnife找不到布局里的视图,绑定自然失败。
3. 排查混淆是否干掉了Binding类
如果你的开启了混淆(minifyEnabled true),一定要在proguard-rules.pro里加上ButterKnife的混淆规则,不然生成的XXX_ViewBinding类会被混淆工具当成无用代码删掉:
-keep class butterknife.** { *; } -dontwarn butterknife.internal.** -keep class **$$ViewBinder { *; } -keepclasseswithmembernames class * { @butterknife.* <fields>; } -keepclasseswithmembernames class * { @butterknife.* <methods>; }
4. 检查父类的绑定逻辑
日志里显示ButterKnife找不到当前类的Binding后去查父类了,如果你在myappBaseMvp里也调用了ButterKnife.bind(this),可能会出现冲突:
- 如果父类需要绑定自己的视图,应该用
ButterKnife.bind(this, view)指定对应的视图对象,不要和子类的绑定逻辑混在一起。 - 确保父类没有提前把
this绑定了,导致子类的绑定失效。
5. 查看编译日志验证注解处理器状态
因为你开了Debug模式,可以去Android Studio的Build窗口里找ButterKnifeProcessor相关的日志,确认它有没有处理WelcomeActivity,有没有成功生成WelcomeActivity_ViewBinding类。如果日志里没提到这个类,那就是注解处理器根本没处理它,回到第一步重新检查依赖配置。
内容的提问来源于stack exchange,提问作者j2emanue
相关产品推荐
相关产品推荐

