Jetpack Compose中能否用TtsSpan调整文本发音?含号码朗读需求
在Jetpack Compose中实现屏幕阅读器逐个朗读电话号码的方案
用TtsSpan实现(推荐)
完全可以通过TtsSpan实现这个需求,Jetpack Compose的语义系统支持通过Modifier.semantics配置带TtsSpan的朗读内容,让屏幕阅读器(如TalkBack)按照电话号码的规则逐个数字朗读。
具体实现示例:
@Composable fun PhoneNumberListItem(phoneNumber: String) { Text( text = phoneNumber, modifier = Modifier .fillMaxWidth() .padding(horizontal = 16.dp, vertical = 12.dp) .semantics { contentDescription = buildAnnotatedString { // 添加电话号码文本 append(phoneNumber) // 为整个电话号码添加Telephone类型的TtsSpan addTtsSpan( start = 0, end = phoneNumber.length, span = TtsSpan.TelephoneBuilder() .setNumber(phoneNumber) .build() ) } } ) }
这段代码通过buildAnnotatedString给电话号码绑定Telephone类型的TtsSpan,系统屏幕阅读器会识别这个标记,自动按照电话号码的朗读逻辑逐个读出数字,而非连读成字符串。
替代方案
如果不想用TtsSpan,也可以通过格式化contentDescription实现类似效果:
@Composable fun PhoneNumberListItem(phoneNumber: String) { val spacedNumber = phoneNumber.toCharArray().joinToString(" ") Text( text = phoneNumber, modifier = Modifier .fillMaxWidth() .padding(horizontal = 16.dp, vertical = 12.dp) .semantics { contentDescription = spacedNumber } ) }
这种方式把电话号码拆成带空格的单个数字,屏幕阅读器会逐个朗读,但相比TtsSpan,它只是通过文本格式实现,没有利用系统的语义识别,适配性不如前者。
注意事项
- 测试时需开启系统屏幕阅读器(如Android的TalkBack),点击列表项验证朗读效果;
- 确保自定义组件未禁用语义支持(默认启用,无需额外设置)。
内容的提问来源于stack exchange,提问作者gureisu
相关产品推荐
相关产品推荐

