【问题标题】:Android Edittext Completely Hide PasswordAndroid Edittext 完全隐藏密码
【发布时间】:2021-09-12 17:04:53
【问题描述】:

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

通常这工作正常。

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

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

【问题讨论】:

  • 创建您自己的TransformationMethod,它只从getTransformation() 返回适当数量的星号String,而不是像PasswordTransformationMethod 那样具有定时跨度的专用CharSequence。您可以使用setTransformationMethod() 将其应用于您的EditText
  • @MikeM。这很有趣,我以前从未听说过,可能值得写一个答案?
  • 这个例子做你想做的事。它变为 。在示例中,但您可以将其更改为 * 或其他任何内容。它暂时不会再显示这些字母了。 stackoverflow.com/a/23110194/11582192
  • @a_local_nobody 嗯,我真的不再那样做了。 :-) 如果您愿意,请随时发布,但您可能想先对其进行测试。我已经有一段时间没有使用那个界面了。
  • 您可以使用 before text changed event 将字符存储在数组中,然后将其转换为 astrik。所以,只会显示 astrik 并且 array 会有你的密码。

标签: android user-interface android-edittext passwords


【解决方案1】:

你没有错过任何东西,我过去一直在努力解决这个问题,直到现在我还没有找到内置的解决方案,我使用 addTextChangedListener 来执行此操作和外部图书馆。

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

我知道这不是解决方案,但它声明这不适用于开发人员,我们必须自己制作。

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

【讨论】:

  • 如您所知,这不是我所希望的。我已经努力完成了(通过使用setOnKeyListener())。给别人机会后,我会发布我的解决方案。
  • 我知道,您问是否有内置解决方案。没有,有很多选择,但你没有要求。
  • 原来使用setOnKeyListener()非常尴尬。多么浪费时间!您必须考虑各种不值得的细节——您不妨从头开始编写自定义 EditText。叹息。
【解决方案2】:

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

诀窍是覆盖 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)
        }
    }
}

并在您的 EditText 中使用它:

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

原来这类似于https://stackoverflow.com/a/23110194/624814(感谢 Per.J!),但现在你在 kotlin 中拥有它。它是如此相似,以至于这个问题可能会因为太相似而被关闭。但是问题的措辞应该比其他帖子更容易帮助人们找到答案。

【讨论】:

  • 这个解决方案似乎确实是必要的,因为我最初的建议是从一个普通的TransformationMethod 返回一个String 与链接的问题有同样的两个大问题,尽管我不是确定该作者是否知道答案修复它的原因。首先,虽然它技术上不是必需的(并且与当前问题无关),但绝对推荐扩展PasswordTransformationMethod,因为有几个instanceOf检查该特定类会影响@中的内部行为987654329@和Editor;例如,wrt 可访问性。其次,返回...
  • ...不同的String 确实会导致IndexOutOfBoundsException,无论它的长度是否正确。虽然我们可能会在输入时设置纯文本,但它在内部被包裹在 Editable 中,并且正如文档所述,“返回的文本必须动态地镜像它,而不是一次性复制”。这基本上意味着我们需要将它包装在另一个CharSequence 中,该Editable 可以返回正确的当前长度,Editable 将在其下方更改,恕不另行通知。 Anyhoo,只是这个答案的一些额外信息,因为它比另一个解释性更强。
  • 顺便说一句,您的subSequence() 回报不太正确,是吗? (虽然我不确定这里是否会调用它。)最后,以防万一有人想知道,PasswordTransformationMethod 使用char DOT = '\u2022' 作为其替换字符。这就是我想的。干杯!
  • @MikeM。感谢cmets和澄清!从别人的角度看事情总是有帮助的。我还没有真正测试过subSequence() 函数;你发现它有什么错误吗?
  • 没问题。这并没有按照我的预期和建议的方式工作,我必须找出原因,所以我想我会分享一下,以防其他人和我一样想知道。无论如何,subSequence() 正在返回来自source CharSequence 的字符,这是传递给getTransformation() 的内容,这是输入EditText 的内容,而不是星号序列,这就是你的如果您在同一范围内使用get(),则可以得到。不过,我不知道TextViewEditor 是否会调用该方法,或者如何使用返回的值。只是提醒一下,真的
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2019-12-13
  • 2014-08-07
  • 1970-01-01
  • 2019-07-22
  • 1970-01-01
  • 2018-02-24
  • 1970-01-01
相关资源
最近更新 更多