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
相关产品推荐
相关产品推荐

