Android Studio开发中使用findViewById后应用崩溃
解决findViewById引发的应用闪退问题
常见原因及修复方法
控件ID不匹配
核对布局XML中控件的android:id与代码里findViewById(R.id.xxx)的ID是否完全一致,注意大小写、拼写细节,比如别把btn_login写成btn_logni。调用时机错误
必须先执行setContentView(R.layout.你的布局文件名)加载页面布局,再调用findViewById查找控件。如果在布局加载前查找,会返回null,调用控件方法时触发空指针异常导致闪退。正确示例:setContentView(R.layout.activity_main); Button submitBtn = findViewById(R.id.btn_submit);代码混淆导致ID丢失
若开启了混淆,要在proguard-rules.pro里添加保护布局ID的规则,避免控件ID被混淆:-keepclassmembers class * extends android.app.Activity { public void *(android.view.View); } -keepclasseswithmembers class * { public <init>(android.content.Context, android.util.AttributeSet); } -keepclasseswithmembers class * { public <init>(android.content.Context, android.util.AttributeSet, int); }Fragment中调用方式错误
Fragment里不能直接调用findViewById,得通过布局加载后的View对象来查找:@Override public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { View rootView = inflater.inflate(R.layout.fragment_home, container, false); Button btn = rootView.findViewById(R.id.btn_submit); return rootView; }控件在嵌套布局中
如果控件在include引入的子布局里,要先获取子布局的根View,再通过它查找目标控件:View includeLayout = findViewById(R.id.include_profile); Button editBtn = includeLayout.findViewById(R.id.btn_edit);
排查小技巧
- 查看Logcat错误日志,截图已显示是NullPointerException,定位到空指针发生的代码行,就能确定是哪个控件查找失败。
- 给findViewById的结果加非空判断,快速定位问题:
Button btn = findViewById(R.id.btn_submit); if(btn != null) { // 执行控件相关操作 } else { Log.e("Debug", "未找到btn_submit控件"); }
内容的提问来源于stack exchange,提问作者Aman Singh 1M
相关产品推荐
相关产品推荐

