使用ButterKnife绑定后嵌套ViewGroup为空问题求助
我来帮你捋捋这个ButterKnife绑定后嵌套ViewGroup为空的问题,这种情况我碰到过不少,大概率是以下几个细节没处理好:
确认ButterKnife的绑定时机与方式正确
在Fragment中使用ButterKnife时,一定要传入inflated后的根View,不能直接调用ButterKnife.bind(this)。正确的做法是在onCreateView方法中加载布局后立即绑定,或者在onViewCreated里绑定:@Override public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { View rootView = inflater.inflate(R.layout.fragment_photo_gallery, container, false); // 必须传入加载好的rootView ButterKnife.bind(this, rootView); return rootView; } @Override public void onDestroyView() { super.onDestroyView(); // Fragment务必在销毁视图时解绑,避免内存泄漏 ButterKnife.unbind(this); }要是漏传了rootView,ButterKnife根本找不到布局里的控件,自然会返回null。
检查XML与代码中的ID是否完全匹配
你提供的XML里disconnected_view是存在的,但要仔细核对Java代码里的@BindView(R.id.disconnected_view)和XML中的id是否完全一致——大小写、下划线、拼写一个都不能错,哪怕差一个字符都会导致绑定失败。另外,XML里这个View的visibility="gone"只是不可见,不会让对象变成null,所以这点不用纠结。排查混淆规则是否配置正确
如果你的项目开启了ProGuard混淆,一定要给ButterKnife添加专属的混淆规则,不然注解会被混淆掉,导致绑定失效。在proguard-rules.pro中添加以下内容:-keep class butterknife.** { *; } -dontwarn butterknife.internal.** -keep class **$$ViewBinder { *; } -keepclasseswithmembernames class * { @butterknife.* <fields>; } -keepclasseswithmembernames class * { @butterknife.* <methods>; }清理缓存并重建项目
有时候Android Studio的缓存会导致注解处理器没有正确生成绑定代码,试试执行Build -> Clean Project,再执行Build -> Rebuild Project,之后重新运行项目,很多时候这种小问题就能解决。确认布局加载方式正确
确保你加载Fragment布局时,LayoutInflater的参数是正确的——比如不要漏传container参数,或者错误地将第三个参数设为false(虽然这一般不会导致控件为空,但也可能影响布局的初始化状态)。
给你一个完整的Fragment绑定示例参考:
public class PhotoGalleryFragment extends Fragment { @BindView(R.id.disconnected_view) RelativeLayout disconnectedView; @BindView(R.id.disconnected_image) ImageView disconnectedImage; @Override public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { View rootView = inflater.inflate(R.layout.fragment_photo_gallery, container, false); ButterKnife.bind(this, rootView); // 这里可以正常操作disconnectedView了,比如设置可见性 // disconnectedView.setVisibility(View.VISIBLE); return rootView; } @Override public void onDestroyView() { super.onDestroyView(); ButterKnife.unbind(this); } }
内容的提问来源于stack exchange,提问作者Maxim Ovchinnikov

