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

RecyclerView项中Material3 Compose TextField光标不显示问题求助

RecyclerView中Compose自定义TextField光标不显示问题排查与解决思路

问题详情

我在RecyclerView列表项里用了基于Material3的Jetpack Compose自定义CustomTextField组件,组件能正常获取焦点、输入内容,唯独光标完全不显示。翻了CoreTextField的源码,发现光标显示的判断逻辑是:

val showCursor = enabled && !readOnly && windowInfo.isWindowFocused && !state.hasHighlight()

排查后发现我的CustomTextField里windowInfo.isWindowFocused一直是false,哪怕组件已经拿到焦点。后来用CompositionProvider把这个值强制设为true,光标就能正常显示了,说明这就是唯一的阻碍。我试过调整RecyclerView里ComposeView的视图组合策略,没用,而且觉得默认策略更适合列表项场景。怀疑这是Jetpack Compose或者Android的bug,想问问有没有人碰到过类似情况,或者是不是我漏了什么配置?

可能的解决方向

1. 修复窗口焦点传递问题

RecyclerView属于嵌套视图层级,可能窗口焦点没正确传到Compose组件里:

  • 先确认当前Activity/Fragment的窗口没有被弹窗、悬浮窗之类的抢占焦点;
  • 可以给ComposeView加焦点监听,同步更新Compose的WindowInfo状态(既然强制设值有效,就把这个逻辑封装起来):
    val windowInfoState = remember { mutableStateOf(WindowInfo(isWindowFocused = true)) }
    CompositionLocalProvider(LocalWindowInfo provides windowInfoState.value) {
        CustomTextField(/* 你的参数 */)
    }
    
    composeView.setOnFocusChangeListener { _, hasFocus ->
        windowInfoState.value = windowInfoState.value.copy(isWindowFocused = hasFocus)
    }
    

2. 处理Compose与View系统的焦点冲突

Compose嵌入到View系统的RecyclerView中时,焦点体系可能有冲突:

  • 给RecyclerView加android:descendantFocusability="beforeDescendants"属性,让子View能优先拿到焦点;
  • 在Compose组件里主动请求焦点:
    val focusRequester = remember { FocusRequester() }
    CustomTextField(
        modifier = Modifier.focusRequester(focusRequester),
        /* 其他参数 */
    )
    LaunchedEffect(Unit) {
        focusRequester.requestFocus()
    }
    

3. 升级Compose版本

部分旧版Compose在嵌套View场景下存在WindowInfo更新不及时的bug:

  • 把Jetpack Compose和Material3的依赖更到最新稳定版,比如:
    implementation "androidx.compose.ui:ui:1.6.0"
    implementation "androidx.compose.material3:material3:1.2.0"
    
  • 要是升级后还没解决,去Google Issue Tracker搜搜有没有类似已上报的bug,或者提交新issue,尽量提供能复现的最小项目(虽然空白项目没复现,但可以尽量贴近原项目场景构造)。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.15 11:58:13