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

如何在TV设备上实现Text Composable的D-PAD导航滚动?

问题分析与解决

你的代码存在两个核心问题,导致无法通过D-PAD实现文本滚动:

  1. 默认verticalScroll不响应D-PAD按键
    verticalScroll是为触摸/鼠标滚动设计的组件,不会自动处理TV设备的D-PAD上下键输入,必须手动监听按键事件来触发滚动逻辑。

  2. Modifier顺序影响事件传递
    verticalScroll需要放在focusable之前,确保滚动区域能正确接收焦点相关的事件,否则焦点事件可能会拦截滚动逻辑的触发。

修正后的代码示例

val scrollState = rememberScrollState()
val focusRequester = rememberFocusRequester()
val coroutineScope = rememberCoroutineScope()

Text(
    text = "这里需要填入足够长的文本内容,确保内容超过50dp的高度限制,这样才能触发滚动效果。比如重复一段较长的文字,直到内容超出组件高度...",
    modifier = Modifier
        .height(50.dp)
        .width(50.dp)
        .verticalScroll(scrollState) // 优先设置滚动属性
        .focusRequester(focusRequester)
        .focusable()
        .onFocusChanged {
            Logger.d("the text is focused")
        }
        .onKeyEvent { event ->
            if (event.type == KeyEventType.KeyDown) {
                when (event.key) {
                    Key.DirectionUp -> {
                        coroutineScope.launch {
                            scrollState.scrollBy(-20f) // 向上滚动,步长可自定义
                        }
                        true
                    }
                    Key.DirectionDown -> {
                        coroutineScope.launch {
                            scrollState.scrollBy(20f) // 向下滚动,步长可自定义
                        }
                        true
                    }
                    else -> false
                }
            } else {
                false
            }
        }
)

LaunchedEffect(Unit) {
    focusRequester.requestFocus()
}

额外注意事项

  • 必须用rememberScrollState()正确初始化滚动状态对象,否则滚动位置无法被保存和更新。
  • 文本内容必须确实超出height(50.dp)的限制,没有溢出的话不会出现滚动空间,自然无法滚动。
  • 滚动步长(示例中的20f)可以根据操作习惯调整,让滚动速度更适配TV设备的交互逻辑。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.21 06:09:59