如何让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
相关产品推荐
相关产品推荐

