ユーザーが「1234」と入力すると、「EditText」フィールドに「1234」と表示されます。そのフィールドがフォーカスを失ったときに "****"を表示したいビューがフォーカスを失ったときにEditTextのテキストをマスクする方法。
EditTextフィールドにフォーカスがない場合、入力されたテキストのみをマスクするカスタムTransformationMethodを実装しました。
「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を拡張します。 プライベート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
}
}
};
私は "ありがとう"コメントを避けるべきであることを知っているが、本当にありがとう! –