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 | * |

如果我们重点关注中间编辑文本,则值更改为密码。是因为消除了焦点,而将字段更改为密码所需的转换时间需要更多时间?有没有什么方法可以强制将这个值更改为密码。

+0

因为您没有对该两个编辑文本使用该属性。设置此属性android:inputType =“textPassword”及其完成的先生 –

+0

我希望它本来就这么简单。每个编辑文本都是问题中指定的编辑文本的精确复本。每个人都有android:inputType =“numberPassword” – user3099103

+0

尝试将代码放入Runnable中,然后发布它,这有帮助吗? – lionscribe

尝试转换

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); } } 

您可以使用此方法

+0

不工作!还是一样的 – user3099103

+0

更新回答! –

+0

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。

+0

UI不能通过使用最大长度为4的单一编辑文本来实现。我们需要4个编辑文本,每个编辑文本的最大长度为1.并且在填充一个后,焦点应该切换到下一个编辑文本。 – user3099103

刚刚从你的代码中删除ed1.clearFocus();后运行以前的文字下面的代码。不要强迫edittext放松焦点,只要告诉其他edittext重新获得焦点ed2.requestFocus();。只要下一个edittext获得焦点,以前的edittext就会自动移除焦点。它会首先转换价值,然后离开它的焦点。

+0

试了一下。但无法正常工作 – 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) { 

    } 
}); 
+0

抱歉..不能正常工作 – user3099103

+0

你得到了什么错误?它在我的机器上运行良好。 –