简体   繁体   English

Jetpack Compose:无法更改 TextField 焦点

[英]Jetpack Compose: can't change TextField focus

So, I have an AlertDialog with a ListItem inside, which in turn has 2 TextField s inside:所以,我有一个AlertDialog里面有一个ListItem ,里面又有 2 个TextField

val keyboardController = LocalSoftwareKeyboardController.current
val focusManager = LocalFocusManager.current
val (nameFieldFocus, valueFieldFocus) = remember{FocusRequester.createRefs()}
AlertDialog(
    ...
    text = {
        ListItem(
            ...
            leadingContent = {
                Column(verticalArrangement = Arrangement.spacedBy(10.dp)) {
                    TextField(
                        modifier = Modifier.focusRequester(nameFieldFocus).focusProperties{next = valueFieldFocus}.focusable(),
                        value = someValue,
                        onValueChange = {someValue = it},
                        label = {Text(text = "Some label")},
                        keyboardOptions = KeyboardOptions(imeAction = ImeAction.Next),
                        keyboardActions = KeyboardActions(onNext = {focusManager.moveFocus(FocusDirection.Next)}),
                        singleLine = true
                    )
                    TextField(
                        modifier = Modifier.focusRequester(valueFieldFocus).focusProperties{previous = nameFieldFocus}.focusable(),
                        value = anotherValue,
                        onValueChange = {anotherValue = it},
                        label = {Text(text = "Another label")},
                        keyboardOptions = KeyboardOptions(keyboardType = KeyboardType.Number),
                        keyboardActions = KeyboardActions(onDone = {focusManager.clearFocus()}),
                        singleLine = true
                    )
                }
            }
        )
    }
)

The problem is, when I press the action key on the keyboard, no focus change occurs , regardless of whether the text fields have text in them or not.问题是,当我按下键盘上的操作键时,无论文本字段中是否包含文本,都不会发生焦点更改 I also tried onNext = null and onDone = null , which is supposed to use the default implementation according to the documentation, but that also doesn't behave as expected.我还尝试onNext = nullonDone = null ,根据文档,这应该使用默认实现,但这也不符合预期。

PS I'm using androidx.compose.material3 . PS我正在使用androidx.compose.material3

You should call val focusManager = LocalFocusManager.current inside AlertDialog , also remove Modifier.focusable() either.您应该在 AlertDialog 中调用val focusManager = LocalFocusManager.current AlertDialog同时删除Modifier.focusable()

AlertDialog(
    text = {

        val focusManager = LocalFocusManager.current

        val (nameFieldFocus, valueFieldFocus) = remember { FocusRequester.createRefs() }


        ListItem(
            leadingContent = {
                Column(verticalArrangement = Arrangement.spacedBy(10.dp)) {
                    TextField(
                        modifier = Modifier
                            .focusRequester(nameFieldFocus)
                            .focusProperties { next = valueFieldFocus },
                        value = someValue,
                        onValueChange = { someValue = it },
                        label = { Text(text = "Some label") },
                        keyboardOptions = KeyboardOptions(imeAction = ImeAction.Next),
                        keyboardActions = KeyboardActions(onNext = {
                            focusManager.moveFocus(
                                FocusDirection.Next
                            )
                        }),
                        singleLine = true
                    )
                    TextField(
                        modifier = Modifier
                            .focusRequester(valueFieldFocus)
                            .focusProperties { previous = nameFieldFocus },
                        value = anotherValue,
                        onValueChange = { anotherValue = it },
                        label = { Text(text = "Another label") },
                        keyboardOptions = KeyboardOptions(keyboardType = KeyboardType.Number),
                        keyboardActions = KeyboardActions(onDone = { focusManager.clearFocus() }),
                        singleLine = true
                    )
                }
            },
            headlineText = {
                Text(text = "Headline Text")
            }
        )
    },
    confirmButton = {
        Button(onClick = { /*TODO*/ }) {
            Text(text = "Confirm")
        }
    },
    onDismissRequest = {

    }
)

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM