package com.gueei.demos.markupDemo.viewModels; import gueei.binding.IBindableView; import gueei.binding.ViewAttribute; import android.content.Context; import android.text.method.ReplacementTransformationMethod; import android.util.AttributeSet; import android.widget.TextView; // Custom View must implement IBindableView // and override getViewAttribute public class CustomViewWidget extends TextView implements IBindableView<CustomViewWidget>{ private char PasswordMask; public CustomViewWidget(Context context, AttributeSet attrs, int defStyle) { super(context, attrs, defStyle); } public CustomViewWidget(Context context, AttributeSet attrs) { super(context, attrs); } public CustomViewWidget(Context context) { super(context); } private ViewAttribute<CustomViewWidget, CharSequence> PasswordMaskViewAttribute = new ViewAttribute<CustomViewWidget, CharSequence>( CharSequence.class, CustomViewWidget.this, "PasswordMask"){ @Override protected void doSetAttributeValue(Object newValue) { if ((newValue == null)||(newValue.toString().length()<1)){ CustomViewWidget.this.setTransformationMethod(null); PasswordMask = 0; return; } PasswordMask = newValue.toString().charAt(0); CustomViewWidget.this.setTransformationMethod(new ReplacementTransformationMethod(){ @Override protected char[] getOriginal() { return CustomViewWidget.this.getText().toString().toCharArray(); } @Override protected char[] getReplacement() { int length = CustomViewWidget.this.getText().length(); char[] output = new char[length]; for(int i=0; i<length; i++){ output[i] = PasswordMask; } return output; } }); } @Override public CharSequence get() { return String.valueOf(PasswordMask); } }; public ViewAttribute<CustomViewWidget, ?> createViewAttribute( String attributeName) { if (attributeName.equals("mask")) return PasswordMaskViewAttribute; return null; } }