Edittext输入类型密码,清除焦点后隐藏文字android

时间:2017-09-15 05:38:06

标签: android android-edittext

我正在使用视图输入用户的四位数PIN。 UI由4个edittext组成,每个都有maxLength设置为1.在输入值以编辑text1时,焦点将转移到第二个edittext,依此类推。每个Edittext输入类型为:numberPassword。

<EditText
            android:id="@+id/ed_1"
            android:layout_width="20dp"
            android:layout_height="20dp"
            android:gravity="center"
            android:inputType="numberPassword"
            android:maxLength="1" />

在java中,为了转移焦点,我们将以下文本观察器应用于每个edittext:

ed1.addTextChangedListener(new TextWatcher() {
        @Override
        public void beforeTextChanged(CharSequence s, int start, int count, int after) {

        }

        @Override
        public void onTextChanged(CharSequence s, int start, int before, int count) {
            if (s.toString().length() == 1) {
                ed1.clearFocus();
                ed2.requestFocus();
                ed2.setCursorVisible(true);
            }
        }

        @Override
        public void afterTextChanged(Editable s) {

        }
    });

问题是,edittext的值不会更改为*,它会显示实际输入的数字(不会更改为密码)。只有第一个和最后一个更改为*,其中中心二表示edittext 2和edittext 3仍然具有可见的密码。

现在:我们有4个输入Edittexts

期望的输出应该是: | * | * | * | * |

当我们填充值并切换焦点时,使用指定的java代码,它们会变为:(输入值:1234): | * | 2 | 3 | * |

如果我们重点关注任一中心编辑文本,则值更改为密码。是因为删除了焦点,将字段更改为密码所需的转换时间需要更长的时间吗?是否有任何方法可以强制将值更改为密码。

5 个答案:

答案 0 :(得分:1)

因为你将maxLength设置为1,所以它只能获得单个字符。您还在onTextChanged中编写了clearFocus的代码,因此它将焦点设置为下一个EditText。您必须在xml中更改如下所示。

<EditText
  android:id="@+id/ed_1"
  android:layout_width="20dp"
  android:layout_height="20dp"
  android:gravity="center"
  android:inputType="numberPassword"
  android:maxLength="4" />

同时删除onTextChanged()中的clearFocus。

答案 1 :(得分:0)

尝试在转换后为前一个文本运行以下代码

yourEditText.setTransformationMethod(new PasswordTransformationMethod());

这是一个困难的方法,但

String e1,e2,e3,e4; 
@Override 
public void onTextChanged(CharSequence s, int start, int before, int count) { 
if (s.toString().length() == 1 && !ed1.getText().equals("*")) { 
e1=ed1.getText(); 
ed1.setText("*"); 
ed2.requestFocus(); 
ed2.setCursorVisible(true); } }

你可以使用这种方法

答案 2 :(得分:0)

只需从代码中删除ed1.clearFocus();即可。不要强制edittext失去焦点,只需告诉其他edittext重新获得焦点ed2.requestFocus();。一旦下一个edittext获得焦点,之前的edittext就会自动删除其焦点。它将首先转换价值,然后留下焦点。

答案 3 :(得分:0)

似乎 TextWatcher 需要一段时间才能将其变为密码类型, 所以我使用处理程序来实现此解决方案,它运行正常。请尝试下面的代码

ed1.addTextChangedListener(new TextWatcher() {
    @Override
    public void beforeTextChanged(CharSequence s, int start, int count, int after) {

    }

    @Override
    public void onTextChanged(CharSequence s, int start, int before, int count) {
        if (s.toString().length() == 1) {

            // use Handler for 1 second delay so that it will change text
            new Handler().postDelayed(new Runnable() {
                @Override
                public void run() {
                    ed2.requestFocus();
                }
            },1000);

        }
    }

    @Override
    public void afterTextChanged(Editable s) {

    }
});

答案 4 :(得分:0)

只需将代码从onTextChanged移至afterTextChanged,就不需要clearFocus,只需要requestFocus。

通过这种方式,您可以在更改焦点之前花时间混淆数字。