我有一个课程,可以将文本转发到手机屏蔽,PHONE_MASK是 const val PHONE_MASK = "+7 (7__) ___-__-__" 当我在文本字段中输入第一个字符时,我的文本指针的位置不正确(鼠标不会移动到文本的结尾) 我认为问题就在这里 override fun originalToTransformed(offset: Int): Int 因为当我输入第一个字符时,ofset仍然是零值

import androidx.compose.ui.text.AnnotatedString
import androidx.compose.ui.text.input.OffsetMapping
import androidx.compose.ui.text.input.TransformedText
import androidx.compose.ui.text.input.VisualTransformation
import kotlin.math.absoluteValue

class PhoneMaskVisualTransformation(val mask: String, val maskedSymbol: Char = MASKED_SYMBOL) :
    VisualTransformation {
    companion object {
        const val MASKED_SYMBOL = '_'
    }

    private val specialSymbolsIndices = mask.indices.filter { mask[it] != maskedSymbol }

    override fun filter(text: AnnotatedString): TransformedText {
        var out = ""
        var maskIndex = 0
        text.forEach { char ->
            while (specialSymbolsIndices.contains(maskIndex)) {
                out += mask[maskIndex]
                maskIndex++
            }
            out += char
            maskIndex++
        }
        return TransformedText(AnnotatedString(out), offsetTranslator())
    }

    private fun offsetTranslator() = object : OffsetMapping {
        override fun originalToTransformed(offset: Int): Int {
            val offsetValue = offset.absoluteValue
            if (offsetValue == 0) return 0
            var numberOfHashtags = 0
            val masked = mask.takeWhile {
                if (it == maskedSymbol) numberOfHashtags++
                numberOfHashtags < offsetValue
            }
            return masked.length + 1
        }

        override fun transformedToOriginal(offset: Int): Int {
            return mask.take(offset.absoluteValue).count { it == maskedSymbol }
        }
    }
} 

推荐答案

我找到了一个解决这个问题的解决方案.口罩效果绝对良好.事实证明,TextField有两个不同的构造函数签名:

fun TextField(
value: String,
onValueChange: (String) -> Unit,
//rest code

)

fun TextField(
value: TextFieldValue,
onValueChange: (TextFieldValue) -> Unit,
//rest code

)

最初,我使用的是第一个带有字符串值的构造函数.但在切换到具有TextFieldValue的第二个构造函数后,问题就得到了解决.

Android相关问答推荐

未解析的引用:背景 colored颜色

ENV变量在gradle进程中没有更新

如何处理谷歌未经证实的应用程序拒绝?

为什么当我在装有Firebase的安卓系统中登录苹果时,收到的邮箱为空?

无法将非静态方法与Frida挂钩

MAP函数返回单位列表而不是字符列表

Android可绘制边框删除底线

Clean MVVM 架构中的 API 响应处理

Android Compose - 为什么 Canvas 中的drawText在底部被切断而不是在顶部?

我的自定义小吃店不适合我的全宽屏幕尺寸

如何在 React Native 下载文件之前打开文件管理器并 Select 一个目录

Visual Studio 无法在 Android 上编译 .NET MAUI 项目

在 Jetpack Compose 的无状态 Compose 中管理条件逻辑

组成不重叠的元素

如何在jetpack compose中创建水印文字效果

在jetpack compose中将图像添加到脚手架顶部栏

在 Jetpack Compose 中找不到 Path 的减号()

Jetpack Compose 中的按钮上的文本未更新

EAS 构建失败,错误代码为 1,但 Expo Build 成功,我需要 EAS 构建来删除未使用的包,如 com.segment.analytics.android:analytics

多个项目 react-native android 构建错误