You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.30 05:12:43