gpt4 book ai didi

android - Jetpack 组合单个数字文本字段

转载 作者:行者123 更新时间:2023-12-04 11:39:49 26 4
gpt4 key购买 nike

我正在尝试创建一个电话验证屏幕,用户必须在自己的文本字段中输入 5 个数字,如下所示。
Verification text field
我有两个问题:

  • 有没有办法将 TextField 限制为 1 个字符。我可以设置单行和最大行数,但从 View 系统中看不到限制字符长度的方法,例如“Ms”。我可以通过忽略第一个字符之后的字符来轻松限制代码中的字符长度,但这仍然允许用户向左和向右“滚动”,即使只有 1 个字符。
  • 有没有办法将宽度包装到 1 个字符?目前我发现限制宽度的唯一方法是专门设置它,但是如果系统文本大小发生变化,它可能会中断。

  • 这是一些有帮助的代码,这是一些非常困惑的解决方案,如果有什么不正确的地方,我们深表歉意:
    @Composable
    fun CodeTextFields(
    modifier: Modifier = Modifier,
    length: Int = 5,
    onFilled: (code: String) -> Unit
    ) {
    var code: List<Char> by remember {
    mutableStateOf(listOf())
    }
    val focusRequesters: List<FocusRequester> = remember {
    val temp = mutableListOf<FocusRequester>()
    repeat(length) {
    temp.add(FocusRequester())
    }
    temp
    }

    Row(modifier = modifier) {
    (0 until length).forEach { index ->
    OutlinedTextField(
    modifier = Modifier
    .weight(1f)
    .padding(vertical = 2.dp)
    .focusRequester(focusRequesters[index]),
    textStyle = MaterialTheme.typography.h4.copy(textAlign = TextAlign.Center),
    singleLine = true,
    value = code.getOrNull(index)?.takeIf { it.isDigit() }?.toString() ?: "",
    onValueChange = { value: String ->
    if (focusRequesters[index].freeFocus()) { //For some reason this fixes the issue of focusrequestor causing on value changed to call twice
    val temp = code.toMutableList()
    if (value == "") {
    if (temp.size > index) {
    temp.removeAt(index)
    code = temp
    focusRequesters.getOrNull(index - 1)?.requestFocus()
    }
    } else {
    if (code.size > index) {
    temp[index] = value.getOrNull(0) ?: ' '
    } else if (value.getOrNull(0)?.isDigit() == true) {
    temp.add(value.getOrNull(0) ?: ' ')
    code = temp
    focusRequesters.getOrNull(index + 1)?.requestFocus() ?: onFilled(
    code.joinToString(separator = "")
    )
    }
    }
    }
    },
    keyboardOptions = KeyboardOptions.Default.copy(
    keyboardType = KeyboardType.Number,
    imeAction = ImeAction.Next
    ),

    )
    Spacer(modifier = Modifier.width(16.dp))
    }
    }
    }

    最佳答案

    要限制为 1 个数字,您可以使用以下内容:

    @Composable
    fun Field (modifier: Modifier = Modifier,
    onValueChange: (String, String) -> String = { _, new -> new }){

    val state = rememberSaveable { mutableStateOf("") }

    OutlinedTextField(
    modifier = modifier.requiredWidth(75.dp),
    singleLine = true,
    value = state.value,
    onValueChange = {
    val value = onValueChange(state.value, it)
    state.value = value
    },
    keyboardOptions = KeyboardOptions(
    keyboardType = KeyboardType.Number,
    imeAction = ImeAction.Next),
    )
    }
    然后使用:
    Field(onValueChange = { old, new ->
    if (new.length > 1 || new.any { !it.isDigit() }) old else new
    })
    enter image description here

    关于android - Jetpack 组合单个数字文本字段,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/67025661/

    26 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com