如何使用 Jetpack Compose 在文本字段中添加国家代码前缀

我希望我的文本字段以国家代码 (+91) 为前缀,用户无法更改该代码。我如何实现这一目标?

stack overflow How to prefix country code in Textfield using Jetpack Compose
原文答案
author avatar

接受的答案

您可以使用 visualTransformation 属性:

就像是:

TextField(
    value = text,
    onValueChange = { text = it},
    visualTransformation = PrefixTransformation("(+91)")
)

和:

class PrefixTransformation(val prefix: String) : VisualTransformation {    
    override fun filter(text: AnnotatedString): TransformedText {
        return PrefixFilter(text, prefix)
    }
}

fun PrefixFilter(number: AnnotatedString, prefix: String): TransformedText {

    var out = prefix + number.text
    val prefixOffset = prefix.length

    val numberOffsetTranslator = object : OffsetMapping {
        override fun originalToTransformed(offset: Int): Int {
            return offset + prefixOffset
        }

        override fun transformedToOriginal(offset: Int): Int {
            if (offset <= prefixOffset-1) return prefixOffset
            return offset - prefixOffset
        }
    }

    return TransformedText(AnnotatedString(out), numberOffsetTranslator)
}

enter image description here


答案:

作者头像

您可以简单地在 textField 内的leadingIcon 参数中添加 Text()

OutlinedTextField(
    value = text,
    onValueChange = onTextChange,
    maxLines = 1,
    leadingIcon =
    {
        Text(
            text = prefixText,
            style = textStyle,
            color = Color.Black,
            modifier = Modifier.padding(start = 24.dp, end = 8.dp)
        )
    }
)
作者头像

您可以使用的另一个选项以及 Gabriele 的答案是使用 TextField 的 leadingIcon 属性

TextField(
    value = text,
    onValueChange = { text = it},
    leadingIcon = {
                Icon(
                    painter = painterResource(id = R.drawable.ic_pound_symbol),
                    contentDescription = null,
                    tint = colorResourceFromAttr(id = R.attr.colorOnSurface)
                )
            }
)

这给了你这个:

a jetpack compose textfield with pound symbol prefix