仅Release变体中BottomSheetBehavior出现NullPointerException问题
解决Release构建中BottomSheetBehavior的NullPointerException问题
你碰到的这个问题很典型——Debug模式下一切正常,切到Release就崩溃,核心原因是ProGuard混淆破坏了BottomSheetBehavior的内部实现。Debug构建默认不开启混淆,所以依赖的类和方法都能正常初始化;而Release构建开启混淆后,BottomSheetBehavior依赖的ViewDragHelper相关代码被错误地移除或重命名,导致初始化失败出现空指针。
解决方案步骤:
1. 添加ProGuard混淆豁免规则
打开你的proguard-rules.pro文件,添加以下规则,保护BottomSheetBehavior及其依赖的类不被混淆:
如果用的是旧版Support库:
# 保留BottomSheetBehavior相关类与内部类 -keep class android.support.design.widget.BottomSheetBehavior { *; } -keep class android.support.design.widget.BottomSheetBehavior$* { *; } # 保留依赖的ViewDragHelper -keep class android.support.v4.widget.ViewDragHelper { *; }
如果已经迁移到AndroidX:
# AndroidX版本的混淆规则 -keep class com.google.android.material.bottomsheet.BottomSheetBehavior { *; } -keep class com.google.android.material.bottomsheet.BottomSheetBehavior$* { *; } -keep class androidx.core.widget.ViewDragHelper { *; }
2. 检查BottomSheetBehavior的初始化代码
从你提供的Java代码片段看,可能遗漏了bottomSheetBehavior的关键初始化步骤——你需要通过BottomSheetBehavior.from()方法获取实例,而不是直接使用未赋值的变量。修正后的代码应该是这样:
private void setBottomSheet() { llBottomSheet = findViewById(R.id.bottom_sheet_layout); // 关键:获取BottomSheetBehavior实例 bottomSheetBehavior = BottomSheetBehavior.from(llBottomSheet); bottomSheetBehavior.setBottomSheetCallback(new BottomSheetBehavior.BottomSheetCallback() { @Override public void onStateChanged(@NonNull View bottomSheet, int newState) { if (newState == BottomSheetBehavior.STATE_EXPANDED) { System.out.println("Inactive Device Bottom Sheet Expanded"); } } @Override public void onSlide(@NonNull View bottomSheet, float slideOffset) { add_device_btn.animate().scaleX(1 - slideOffset).scaleY(1 - slideOffset).setDuration(0).start(); } }); }
3. 重新构建Release版本
添加完规则并修正代码后,clean项目再重新构建Release变体,空指针问题应该就能解决了。
内容的提问来源于stack exchange,提问作者Srinath
相关产品推荐
相关产品推荐

