android - 如何用占位符填充edittext直到它没有被填充

标签 android kotlin android-edittext android-textwatcher

我遇到了以下问题:我需要为应该将手机输入到 EditText 的情况实现解决方案。这款手机应该有不可移动的部分,最后四个数字应该在开头用下划线填充,然后当用户输入它们时,下划线应该改为数字,例如:+12345____ -> typing 6 -> +123456___我实现了不可移动的部分。这是我的做法:

binding.etPhoneNumber.filters = arrayOf(InputFilter.LengthFilter(args.phoneNumber?.length ?: 0))

binding.etPhoneNumber.doAfterTextChanged {
            val symbolsLeft = it?.toString()?.length ?: 0
            if (symbolsLeft < phoneNumberUi.length) {
                binding.etPhoneNumber.setText(phoneNumberUi)
                binding.etPhoneNumber.setSelection(symbolsLeft + 1)
            }
        }
但现在我不明白,如何处理带下划线的逻辑。我尝试在 doAfterTextChanged 中附加下划线,例如如果 ((args.phoneNumber?.length ?: 0) > (it?.toString()?.length ?: 0)) 附加 n 个下划线,其中 n 是长度之间的差异,但在这种情况下,我无法添加新符号,因为 EditText 已填充且下划线未删除。那么,我该如何解决这个问题呢?提前感谢您的帮助!

最佳答案

您可以删除 LengthFilter并检查 doAfterTextChanged 中的长度:

    val phoneNumberUi = "+12345"
    val length = 10

    binding.etPhoneNumber.doAfterTextChanged {
        when {
            it == null -> {
            }
            // missing / incomplete prefix
            it.length < phoneNumberUi.length -> {
                it.replace(0, it.length, phoneNumberUi)
            }
            // prefix was edited
            !it.startsWith(phoneNumberUi) -> {
                it.replace(0, phoneNumberUi.length, phoneNumberUi)
            }
            // too short
            it.length < length -> {
                it.append("_".repeat(length - it.length))
            }
            // too long
            it.length > length -> {
                it.replace(length, it.length, "")
            }
            // set the cursor at the first _
            it.indexOf("_") >= 0 -> {
                binding.etPhoneNumber.setSelection(it.indexOf("_"))
            }
        }
    }
注意:这里使用 when因为每次更改都会立即触发对 doAfterTextChanged 的递归调用

关于android - 如何用占位符填充edittext直到它没有被填充,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/68036238/

相关文章:

android - BottomNavigationView 与导航图再次加载 fragment

java - 让 edittext 显示与按下的键不同的键

android - 将 API 调用与 RX Java 相结合

android - 升级到 gradle 3.+ 时出现应用程序 build.gradle 同步问题

java - 提供的 javaHome 似乎无效。我找不到 java 可执行文件。尝试位置 : C:\Program Files\Java\jdk-17\bin\java. exe

java - 膨胀 View 问题。尝试向布局添加 View 。类转换异常

javax.smartcardio.* 在 Open JDK 11(Redhat) 上找不到

java - 如何将 kotlin 类添加到 gradle JavaCompile 任务

android - 如何以编程方式使用默认的 AlertDialog 添加 TextView 和 EditText

android - Textwatcher 给出 Stackoverflow 错误