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

如何在Android Compose应用中设置初始键盘焦点?

在Android Compose中设置初始键盘焦点

针对你的视图结构和遇到的FocusRequester未初始化问题,按以下步骤解决:

步骤1:正确创建并保存FocusRequester

在父可组合函数中,使用remember创建FocusRequester实例,确保它在重组时不会被重复创建:

@Composable
fun Parent() {
    val focusRequester = remember { FocusRequester() }
    
    // 传递给子组件
    Child(focusRequester = focusRequester)
}

步骤2:将FocusRequester关联到目标组件

把focusRequester传递给子可组合函数,并通过Modifier.focusRequester()绑定到Button上:

@Composable
fun Child(focusRequester: FocusRequester) {
    Button(
        onClick = { /* 点击逻辑 */ },
        modifier = Modifier
            .focusRequester(focusRequester)
            // Button默认自带focusable属性,若为非聚焦组件需额外添加.focusable()
    ) {
        Text("目标按钮")
    }
}

步骤3:在合适时机请求焦点

使用LaunchedEffect在组合完成后触发焦点请求(避免在composition阶段直接调用,这正是报错提示的核心问题):

@Composable
fun Parent() {
    val focusRequester = remember { FocusRequester() }
    
    // 仅在首次组合时执行焦点请求
    LaunchedEffect(focusRequester) {
        focusRequester.requestFocus()
    }
    
    Child(focusRequester = focusRequester)
}

关键注意点

  • 必须用remember保存FocusRequester:否则每次重组都会生成新实例,无法和目标组件保持关联。
  • 焦点请求属于副作用:不能在composition期间直接调用requestFocus(),需放在LaunchedEffect、事件回调(如点击)等合适的时机执行。
  • 确保组件可聚焦:如果使用的是Text这类非默认聚焦组件,需要手动添加Modifier.focusable()。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.02 01:15:31