Android Edittext 完全隐藏密码

Sco*_*ggs 2 passwords user-interface android android-edittext

通常设置inputType=textPassword用户可以在其中输入任何有风险的内容的字段,例如......密码。当用户键入时,他们键入的每个字符都会短暂闪烁,让用户知道实际输入的内容,然后变成星号,以便临时观察者(间谍)更难以看到键入的内容。

一般来说,这工作得很好。

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

我可以通过 单独处理每个水龙头setOnKeyListener(),但这似乎应该很容易。但是我没有看到任何内置解决方案。请告诉我我错过了一些东西。

Sco*_*ggs 5

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

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

这是自定义类的示例(在 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)
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

并在您的 EditText 中使用它:

    val et = findViewById<EditText>(R.id.my_password_edittext)
    et.transformationMethod = ReallyHideMyPassword();
Run Code Online (Sandbox Code Playgroud)

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