如何在视图失去焦点时在EditText中掩盖文本。

问题描述:

因此,如果用户输入“1234”,他们将在EditText字段中看到“1234”。但是当该字段丢失焦点时,我希望它显示“****”如何在视图失去焦点时在EditText中掩盖文本。

所以我实现了一个自定义TransformationMethod,它只会在EditText字段没有焦点时屏蔽输入的文本。

当我输入文本“12345”它显示它应该是“12345”,但当我点击不同的字段时,数字永远不会被屏蔽。我想看到“*****”,但我仍然看到相同的“12345”

如果我旋转设备(强制它重新加载所有内容),它会正确显示“*****”。当我点击EditText字段时,它将屏蔽的文本从“*****”正确地更改为“12345”。因此,它在获得焦点时起作用,但在失去焦点时不起作用。我试过实现一个OnFocusChangeListener,但它似乎没有任何影响。

有什么办法可以强制EditText字段重新绘制文本时,它失去了焦点?

设置:

editText.setTransformationMethod(CustomPasswordTransformationMethod(numUnobfuscatedDigits)) 
editText.setOnFocusChangeListener { view, hasFocus -> 
        ((EditText)view).invalidate()  
        ((EditText)view).refreshDrawableState()      

CustomPasswordTransformationMethod: 公共类CustomPasswordTransformationMethod延伸PasswordTransformationMethod { 私人INT是非模糊= 1; private boolean mIsFocused = false;

/** 
    * @param number the number of digits that will be unObfuscated at the end of the input string. Must be a positive integer or 0. 
    */ 
    public CustomPasswordTransformationMethod(int number) { 
     if (number < 0) { 
      Log.e(TAG, "Invalid parameter number =" + number + " number of un-obfuscated digits must be a positive integer or 0."); 
      unObfuscated = 0; 
     } 
     unObfuscated = number; 
    } 

    @Override 
    public CharSequence getTransformation(CharSequence source, View view) { 
     return new PasswordCharSequence(source); 
    } 

    @Override 
    public void onFocusChanged(View view, CharSequence sourceText, 
           boolean focused, int direction, 
           Rect previouslyFocusedRect) { 
     super.onFocusChanged(view,sourceText,focused, direction, previouslyFocusedRect); 
     mIsFocused = focused; 
    } 


    private class PasswordCharSequence implements CharSequence { 
     private CharSequence mSource; 

     public PasswordCharSequence(CharSequence source) { 
      mSource = source; // Store char sequence 
     } 

     public char charAt(int index) { 
      if(mIsFocused) return mSource.charAt(index); 
      else { 
       if (index < ((length()) - unObfuscated)) return '●'; 
       return mSource.charAt(index); 
      } 
     } 

     public int length() { 
      return mSource.length(); // Return default 
     } 

     public CharSequence subSequence(int start, int end) { 
      return mSource.subSequence(start, end); // Return default 
     } 
    } 
}; 

试试这个,看看它做你需要什么。

editText.setOnFocusChangeListener(new View.OnFocusChangeListener() { 
    @Override 
    public void onFocusChange(View view, boolean hasFocus) { 
     if(hasFocus){ 
      editText.setTransformationMethod(HideReturnsTransformationMethod.getInstance()); 
     } 
     else{ 
      editText.setTransformationMethod(PasswordTransformationMethod.getInstance()); 
     } 
    } 
}); 
+0

我知道我们应该避免“谢谢”意见,但认真谢谢你! –

也许你可以尽量保持简单:

String password = ""; 

editText.setOnFocusChangeListener(new OnFocusChangeListener() { 
    @Override 
    public void onFocusChange(View view, boolean hasFocus) { 
     if (hasFocus) { 
      editText.setText(password, TextView.BufferType.EDITABLE); 
     } else { 
      password = editText.getText().toString(); 
      String ofuscated = ""; 
      for (int i = 0; i < password.length(); i++){ ofuscated += "*"; } 
      editText.setText(ofuscated, TextView.BufferType.EDITABLE); 
     } 
    } 
}); 
+0

这是一个好主意,不幸的是我需要底层文本保持不变,因为每次编辑时都会将整个字符串保存到数据库中。使用密码TransformationMethod在作为可编辑传递给TextWatcher时将底层文本“12345”保留。 –