Android InputType.TYPE_数字_变体_密码到可见数字密码(仅数字)

Android InputType.TYPE_数字_变体_密码到可见数字密码(仅数字),android,android-edittext,Android,Android Edittext,我实现了一个Edittext,它接受numberPassword,还允许用户显示密码和隐藏密码。这是可行的,但有一个问题我无法解决 我使用InputType.TYPE\u CLASS\u NUMBER和InputType.TYPE\u NUMBER\u VARIATION\u PASSWORD隐藏有效的密码,我使用InputType.TYPE\u TEXT\u VARIATION\u VISIBLE\u PASSWORD使其可见 但是,InputType.TYPE\u TEXT\u VARIAT

我实现了一个Edittext,它接受numberPassword,还允许用户显示密码和隐藏密码。这是可行的,但有一个问题我无法解决

我使用
InputType.TYPE\u CLASS\u NUMBER和InputType.TYPE\u NUMBER\u VARIATION\u PASSWORD
隐藏有效的密码,我使用
InputType.TYPE\u TEXT\u VARIATION\u VISIBLE\u PASSWORD
使其可见

但是,
InputType.TYPE\u TEXT\u VARIATION\u VISIBLE\u PASSWORD
也允许用户同时输入字符和数字,但我不希望这样。我希望用户只能输入数字

请问我怎样才能做到这一点

下面是我的代码:

private fun setShowHiddenField(field: TextInputEditText, checked: Boolean){
        if(checked){
            field.inputType = InputType.TYPE_TEXT_VARIATION_VISIBLE_PASSWORD
        } else {
            field.inputType = InputType.TYPE_CLASS_NUMBER or InputType.TYPE_NUMBER_VARIATION_PASSWORD
        }
        field.setSelection(field.getText().toString().length)
    }
编辑

如果有人问我为什么不使用XML?即使使用xml,使用
InputType.TYPE\u TEXT\u VARIATION\u VISIBLE\u PASSWORD
仍会显示一个同时允许文本和数字的键盘

我的编辑文本代码如下:

<android.support.design.widget.TextInputEditText
                android:id="@+id/cardNumberEditText"
                android:layout_width="match_parent"
                android:layout_height="wrap_content"
                android:inputType="numberPassword"
                android:maxLines="1"
                android:digits="1234567890"
                tools:ignore="LabelFor,NegativeMargin"/>

将此视为Edittext接受PIN码,您还希望为用户提供查看和隐藏PIN码的选项


我使用复选框允许用户选择隐藏或显示。因此,我无法使用密码选项,如
passwordToggleContentDescription
passwordToggleEnabled
passwordToggleTint

我找到了解决问题的方法,虽然不是直接的解决方案,但它是有效的

从技术上讲,在使用模拟器时,您可能会看到键盘从字母快速变为数字,但这在设备上运行得非常好,因为除非您非常注意,否则您几乎无法注意到键盘的快速变化


您可以通过太简单的xml实现。@Blacklind如果您在代码中实现,则在使用InputType.TYPE\u TEXT\u VARIATION\u VISIBLE\u PASSWORD后会得到相同的结果
private fun setShowHiddenField(field: TextInputEditText, checked: Boolean){
        if(checked){
            field.inputType = InputType.TYPE_TEXT_VARIATION_VISIBLE_PASSWORD

            // set keyboard back to allowing only digits & specify them
            field.keyListener = DigitsKeyListener.getInstance("0123456789")

        } else {
            field.inputType = InputType.TYPE_CLASS_NUMBER or InputType.TYPE_NUMBER_VARIATION_PASSWORD
        }
        field.setSelection(field.getText().toString().length)
    }