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

如何让Google Maps Compose SDK的GoogleMap组件失去可聚焦性?

解决google-maps-compose组件焦点穿透的无障碍适配问题

我们在生产应用中使用google-maps-compose的GoogleMap组件实现混合搜索功能,搭配了显示结果列表的底部弹窗。为引导视障用户聚焦底部弹窗的结果,需要让GoogleMap组件不可聚焦,但发现该组件会穿透上层弹窗获取焦点,常规的Compose无障碍适配方法均无效。

已尝试的无效方案

  • Modifier.focusable(enabled = false)
  • Modifier.clearAndSetSemantics {}
  • Modifier.semantics { invisibleToUser() }

可行解决方案

1. 从原生View层面屏蔽焦点

GoogleMap本质是原生MapView的Compose封装,直接操作原生View的焦点属性更有效:

AndroidView(
    factory = { context ->
        MapView(context).apply {
            isFocusable = false
            isFocusableInTouchMode = false
            // 彻底屏蔽无障碍识别
            importantForAccessibility = View.IMPORTANT_FOR_ACCESSIBILITY_NO
        }
    },
    update = { mapView ->
        // 处理MapView的初始化与更新逻辑,例如关联GoogleMap实例
    }
)

2. 让弹窗主动抢占焦点

给底部弹窗的根布局添加焦点请求器,弹窗显示时主动请求焦点,同时确保弹窗本身可聚焦:

val focusRequester = remember { FocusRequester() }

// 弹窗显示时触发焦点请求
LaunchedEffect(弹窗显示状态) {
    if (弹窗显示状态) {
        focusRequester.requestFocus()
    }
}

BottomSheetScaffold(
    sheetContent = {
        Column(
            modifier = Modifier
                .focusRequester(focusRequester)
                .focusable()
                .fillMaxWidth()
        ) {
            // 搜索结果列表内容
        }
    },
    sheetProperties = BottomSheetProperties(focusable = true)
) {
    GoogleMap(/* 原有配置 */)
}

3. 外层语义屏蔽包裹

用Box完全包裹GoogleMap,给Box设置无障碍不可见语义,从语义层级屏蔽下层Map组件:

Box(
    modifier = Modifier
        .fillMaxSize()
        .semantics { invisibleToUser() }
) {
    GoogleMap(modifier = Modifier.fillMaxSize())
}

目前google-maps-compose SDK已有相关issue,建议关注官方后续更新,以上为临时适配方案。

内容的提问来源于stack exchange,提问作者Lucas

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.21 19:22:45