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

Jetpack Compose中FocusRequester与LocalFocusManager失效问题排查

解决Jetpack Compose TextField焦点切换失效问题

你的代码里有三个核心问题导致焦点切换失效,对应修正方案如下:

问题分析与修正点

  • 共用FocusRequester导致焦点冲突:两个TextField使用了同一个FocusRequester,会打乱焦点管理逻辑,每个输入框需要独立的焦点请求器。
  • KeyboardActions与ImeAction不匹配:Time输入框的imeAction设为Done,但keyboardActions里写的是onNext回调,点击Done按钮时逻辑不会触发,需改为onDone。
  • 焦点遍历方向不可靠:Row布局下,FocusDirection.Next无法精准定位到另一个Column中的TextField,直接调用目标输入框的焦点请求器更稳妥。

修正后的完整代码

// 为每个TextField创建独立的FocusRequester
val dateFocusRequester = remember { FocusRequester() }
val timeFocusRequester = remember { FocusRequester() }

val localFocusManager = LocalFocusManager.current

Row(
    modifier = Modifier.fillMaxWidth(),
    horizontalArrangement = Arrangement.SpaceBetween
) {
    Column(modifier = Modifier.weight(1f)) {
        Text(
            modifier = Modifier.fillMaxWidth().padding(horizontal = 16.dp, vertical = 8.dp),
            text = "Date",
            style = TextStyle(
                color = MaterialTheme.colorScheme.onSurface,
                fontSize = 18.sp,
                fontWeight = FontWeight.Bold
            )
        )

        TextField(
            modifier = Modifier.fillMaxWidth().padding(end = 8.dp)
                .focusRequester(dateFocusRequester)
                .onFocusEvent {
                    showDatePicker = it.isFocused
                },
            value = inputDate,
            onValueChange = { inputDate = it },
            placeholder = { Text(text = "dd/mm/yy") },
            leadingIcon = {
                Icon(
                    modifier = Modifier.size(24.dp),
                    imageVector = ImageVector.vectorResource(R.drawable.calendar_days_svgrepo_com),
                    contentDescription = "Date icon"
                )
            },
            keyboardOptions = KeyboardOptions(imeAction = ImeAction.Next),
            keyboardActions = KeyboardActions(
                onNext = {
                    // 直接请求Time输入框获取焦点
                    timeFocusRequester.requestFocus()
                }
            )
        )
    }

    Column(modifier = Modifier.weight(1f)) {
        Text(
            modifier = Modifier.fillMaxWidth().padding(horizontal = 16.dp, vertical = 8.dp),
            text = "Time",
            style = TextStyle(
                color = MaterialTheme.colorScheme.onSurface,
                fontSize = 18.sp,
                fontWeight = FontWeight.Bold
            )
        )

        TextField(
            modifier = Modifier.fillMaxWidth().padding(start = 8.dp)
                .focusRequester(timeFocusRequester)
                .onFocusEvent {
                    showTimePicker = it.isFocused
                },
            value = inputTime,
            onValueChange = { inputTime = it },
            placeholder = { Text(text = "Time") },
            leadingIcon = {
                Icon(
                    modifier = Modifier.size(24.dp),
                    imageVector = ImageVector.vectorResource(R.drawable.stopwatch_svgrepo_com),
                    contentDescription = "Time icon"
                )
            },
            keyboardOptions = KeyboardOptions(imeAction = ImeAction.Done),
            keyboardActions = KeyboardActions(
                // 匹配Done动作的回调
                onDone = {
                    localFocusManager.clearFocus()
                }
            )
        )
    }
}

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.18 01:22:36