Android Edittext完全隐藏密码

Android Edittext Completely Hide Password

通常设置 inputType=textPassword 用于用户输入任何有风险的内容的字段,例如...密码。当用户键入它时,他们键入的每个字符都会短暂闪烁,让用户知道实际输入的是什么,然后变成星号,这样不经意的观察者(间谍)就很难看到键入的内容。

通常这很好用。

我有一个特殊情况,出于安全原因,不得闪烁该字符。相反,我只想显示星号。

我可以通过 setOnKeyListener() 单独处理每个点击,但看起来这应该很容易。但是我没有看到任何内置解决方案。请告诉我我遗漏了什么。

你没有遗漏任何东西,我过去一直在努力解决这个问题,直到现在 我没有找到任何内置解决方案,我已经使用 addTextChangedListener 执行此操作和外部库。

禁用此设置完全符合您的要求,它适用于每个应用程序,但我想您只能通过代码更改此设置 phone。

我知道这不是解决方案,但它声明这对开发人员不可用,我们必须自己做。

编辑: 评论提供了很好的解决方案,但正如您所说,不是内置的。

感谢所有评论、督促并指出优秀技巧的人。使用这些宝贵的帮助,我能够做一些实际上非常简单并且似乎非常适合这种情况的事情。

诀窍是覆盖 PasswordTransformationMethod 并强制您的 EditText 使用这个新方法。最初的 charAt() 方法使用 Spannable,它在隐藏它之前等待一秒半。通过覆盖该方法,您的代码可以做一些更简单的事情。

这是自定义的示例 class(在 kotlin 中)

class ReallyHideMyPassword : PasswordTransformationMethod() {

    companion object {
        const val HIDE_CHAR = '*'
    }

    override fun getTransformation(source: CharSequence, view: View): CharSequence {
        return PasswordCharSequence(source)
    }

    inner class PasswordCharSequence (private val source: CharSequence) : CharSequence {

        override val length: Int
            get() = source.length

        override fun get(index: Int): Char = HIDE_CHAR

        override fun subSequence(startIndex: Int, endIndex: Int): CharSequence {
            return source.subSequence(startIndex, endIndex)
        }
    }
}

并在您的 EditText 中使用它:

    val et = findViewById<EditText>(R.id.my_password_edittext)
    et.transformationMethod = ReallyHideMyPassword();

事实证明这类似于 (感谢 Per.J!),但现在您在 kotlin 中有了它。它是如此相似,以至于这个问题可能会因为太相似而被关闭。但是问题的措辞应该比其他的更容易帮助人们找到答案post.