Android 14更新后ExpandableListView崩溃问题排查求助
Android 14+ 部分设备 ExpandableListView 空指针崩溃排查与修复
我们在Android 14及以上版本的部分设备上遇到了ExpandableListView的崩溃问题,具体信息如下:
- 涉及组件:
android.widget.ExpandableListView - 触发方法:
onInitializeAccessibilityNodeInfoForItem - 错误类型:
NullPointerException,报错信息为getUnflattenedPos on ExpandableListConnector (null object reference) - 堆栈跟踪:
android.widget.ExpandableListView.onInitializeAccessibilityNodeInfoForItem (ExpandableListView.java:1154) android.widget.AbsListView$ListItemAccessibilityDelegate.onInitializeAccessibilityNodeInfo (AbsListView.java:2800) android.view.View.onInitializeAccessibilityNodeInfo (View.java:9299) android.view.View.createAccessibilityNodeInfoInternal (View.java:9260) android.view.View$AccessibilityDelegate.createAccessibilityNodeInfo (View.java:33380) android.view.View.createAccessibilityNodeInfo (View.java:9243) android.view.AccessibilityInteractionController$AccessibilityNodePrefetcher.prefetchDescendantsOfRealNode (AccessibilityInteractionController.java:1592) android.view.AccessibilityInteractionController$AccessibilityNodePrefetcher.prefetchDescendantsOfRealNode (AccessibilityInteractionController.java:1615) android.view.AccessibilityInteractionController$AccessibilityNodePrefetcher.prefetchAccessibilityNodeInfos (AccessibilityInteractionController.java:1381) android.view.AccessibilityInteractionController.findAccessibilityNodeInfoByAccessibilityIdUiThread (AccessibilityInteractionController.java:425) android.view.AccessibilityInteractionController.-$$Nest$mfindAccessibilityNodeInfoByAccessibilityIdUiThread android.view.AccessibilityInteractionController$PrivateHandler.handleMessage (AccessibilityInteractionController.java:1785) android.os.Handler.dispatchMessage (Handler.java:106) android.os.Looper.loopOnce (Looper.java:230) android.os.Looper.loop (Looper.java:319) android.app.ActivityThread.main (ActivityThread.java:8893) java.lang.reflect.Method.invoke (Method.java) com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run (RuntimeInit.java:608) com.android.internal.os.ZygoteInit.main (ZygoteInit.java:1103)
该问题仅在部分Android 14+设备上出现,推测与设备特定配置或系统差异相关。查阅官方文档及已知问题库未找到匹配案例,初步判断是Android 14中ExpandableListView或关联类的内部变更导致。
可能的修复方案
方案1:自定义ExpandableListView,增加异常防护
通过继承ExpandableListView,重写触发崩溃的方法,捕获空指针异常并做兜底处理:
public class SafeExpandableListView extends ExpandableListView { public SafeExpandableListView(Context context) { super(context); } public SafeExpandableListView(Context context, AttributeSet attrs) { super(context, attrs); } public SafeExpandableListView(Context context, AttributeSet attrs, int defStyleAttr) { super(context, attrs, defStyleAttr); } @Override void onInitializeAccessibilityNodeInfoForItem(View view, int position, AccessibilityNodeInfo info) { try { super.onInitializeAccessibilityNodeInfoForItem(view, position, info); } catch (NullPointerException e) { // 捕获空指针避免崩溃,同时设置基础无障碍信息 info.setClassName(getClass().getName()); info.setScrollable(isScrollable()); } } }
将布局中的ExpandableListView替换为这个自定义类即可。
方案2:禁用无障碍节点预取
崩溃发生在无障碍节点预取流程中,若应用对该场景的无障碍支持要求不高,可尝试禁用子节点预取:
@Override protected void onResume() { super.onResume(); if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.UPSIDE_DOWN_CAKE) { getWindow().getDecorView().setAccessibilityDelegate(new View.AccessibilityDelegate() { @Override public void onInitializeAccessibilityNodeInfo(View host, AccessibilityNodeInfo info) { super.onInitializeAccessibilityNodeInfo(host, info); info.setPrefetchDescendants(false); } }); } }
方案3:确保适配器数据状态稳定
检查ExpandableListAdapter的核心方法(getGroupCount()、getChildCount(int groupPosition)等)返回值是否稳定,数据更新时必须调用notifyDataSetChanged()或对应通知方法,避免内部状态错乱导致ExpandableListConnector异常。
原因分析
从堆栈跟踪来看,崩溃源于ExpandableListConnector对象为空,调用getUnflattenedPos时触发空指针。这大概率是Android 14对无障碍流程的内部逻辑变更,部分设备的系统实现中存在mConnector未及时初始化或被意外置空的场景。
内容的提问来源于stack exchange,提问作者John Campusano
相关产品推荐
相关产品推荐

