Android 如何在视图失去焦点时屏蔽EditText中的文本。

Android 如何在视图失去焦点时屏蔽EditText中的文本。,android,android-edittext,Android,Android Edittext,因此,如果用户输入“1234”,他们将在EditText字段中看到“1234”。但是,当该字段失去焦点时,我希望它显示“***” 因此,我实现了一个自定义TransformationMethod,如果EditText字段没有焦点,它将仅屏蔽输入的文本 当我输入文本“12345”时,它显示为它应该显示的“12345”,但当我单击另一个字段时,数字永远不会被屏蔽。我想看“******”,但我还是看到同样的“12345” 如果我旋转设备(强制它重新加载所有内容),它会正确显示“******”。当我点击

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

因此,我实现了一个自定义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; 私有布尔失焦=假

    /**
     * @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
        }
    }
};
/**
*@param number在输入字符串末尾不模糊的位数。必须为正整数或0。
*/
公共CustomPasswordTransformationMethod(整数){
如果(数字<0){
Log.e(标记“Invalid parameter number=“+number+”未混淆的数字数必须是正整数或0”);
未模糊=0;
}
未模糊=数字;
}
@凌驾
公共CharSequence getTransformation(CharSequence源,视图){
返回新的PasswordCharSequence(源);
}
@凌驾
public void onFocusChanged(视图、字符序列、源文本、,
布尔聚焦,整数方向,
直肠前病灶(直肠){
super.onFocusChanged(视图、源文本、聚焦、方向、先前的聚焦删除);
不聚焦=聚焦;
}
私有类PasswordCharSequence实现CharSequence{
私有字符源;
公共密码CharSequence(CharSequence源){
mSource=source;//存储字符序列
}
公共字符(整型索引){
如果(对焦错误)返回mSource.charAt(索引);
否则{
如果(索引<((长度())-未模糊))返回'●';
返回mSource.charAt(索引);
}
}
公共整数长度(){
返回mSource.length();//返回默认值
}
公共字符序列子序列(int开始,int结束){
返回mSource.subSequence(开始,结束);//返回默认值
}
}
};

也许你可以试着保持简单:

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);
        }
    }
});
String password=”“;
setOnFocusChangeListener(新的OnFocusChangeListener(){
@凌驾
public void onFocusChange(视图,布尔hasFocus){
如果(hasFocus){
editText.setText(密码,TextView.BufferType.EDITABLE);
}否则{
password=editText.getText().toString();
一串被驱散的=”;
对于(inti=0;i
试试这个,看看它是否满足您的需要

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

这是个好主意,不幸的是,我需要底层文本保持不变,因为每次编辑时我们都会将整个字符串保存到数据库中。当底层文本“12345”作为可编辑文本传递给TextWatcher时,使用password TransformationMethod会保留它。我知道我们应该避免使用“thank you”(谢谢)注释,但非常感谢!