Edittext输入密码,清除焦点后隐藏文字android
我正在使用视图来输入用户的四位数PIN。用户界面由4个edittext组成,每个edittext的maxLength设置为1.在输入编辑文本1的值时,焦点会转移到第二个编辑文本等等。每个Edittext输入类型是:numberPassword。Edittext输入密码,清除焦点后隐藏文字android
<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 | * |
如果我们重点关注中间编辑文本,则值更改为密码。是因为消除了焦点,而将字段更改为密码所需的转换时间需要更多时间?有没有什么方法可以强制将这个值更改为密码。
尝试转换
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); } }
您可以使用此方法
不工作!还是一样的 – user3099103
更新回答! –
ed1.setText(“*”);在onTextChanged将再次调用条件为true的onTextChanged,并将进入无限循环..因此导致ANR。 – user3099103
因为您将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。
UI不能通过使用最大长度为4的单一编辑文本来实现。我们需要4个编辑文本,每个编辑文本的最大长度为1.并且在填充一个后,焦点应该切换到下一个编辑文本。 – user3099103
刚刚从你的代码中删除ed1.clearFocus();
后运行以前的文字下面的代码。不要强迫edittext放松焦点,只要告诉其他edittext重新获得焦点ed2.requestFocus();
。只要下一个edittext获得焦点,以前的edittext就会自动移除焦点。它会首先转换价值,然后离开它的焦点。
试了一下。但无法正常工作 – user3099103
好像TextWatcher需要一些时间吧chenge密码类型, 所以我想出了这个解决方案使用处理器,它工作正常。请尝试以下代码
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) {
}
});
抱歉..不能正常工作 – user3099103
你得到了什么错误?它在我的机器上运行良好。 –
因为您没有对该两个编辑文本使用该属性。设置此属性android:inputType =“textPassword”及其完成的先生 –
我希望它本来就这么简单。每个编辑文本都是问题中指定的编辑文本的精确复本。每个人都有android:inputType =“numberPassword” – user3099103
尝试将代码放入Runnable中,然后发布它,这有帮助吗? – lionscribe