我正在使用视图输入用户的四位数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 | * |
如果我们重点关注任一中心编辑文本,则值更改为密码。是因为删除了焦点,将字段更改为密码所需的转换时间需要更长的时间吗?是否有任何方法可以强制将值更改为密码。
答案 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。
通过这种方式,您可以在更改焦点之前花时间混淆数字。