getCompoundDrawables
方法简介:
用于获取当下该控件的上下左右位置的Drawable引用,该方法返回的是Drawable[]数组,length为4,分别对应Left,Top,Right和Bottom的Drawable引用。比如:以下代码的Edittext,drawable[2]就对应于EditText控件的右端。在代码中动态添加图标就用到这个方法,相当于XML文件中的drawableRight。
代码:
@H_404_13@public @H_404_13@class ClearableEditText @H_404_13@extends EditText @H_404_13@implements View.OnTouchListener,View.OnFocusChangeListener,TextWatcher {
@H_404_13@public @H_404_13@interface Listener {
@H_404_13@void didClearText();
}
@H_404_13@public @H_404_13@void setListener(Listener listener) {
@H_404_13@this.listener = listener;
}
@H_404_13@private Drawable xD;
@H_404_13@private Listener listener;
@H_404_13@public ClearableEditText(Context context) {
@H_404_13@super(context);
init();
}
@H_404_13@public ClearableEditText(Context context,AttributeSet attrs) {
@H_404_13@super(context,attrs);
init();
}
@H_404_13@public ClearableEditText(Context context,AttributeSet attrs,@H_404_13@int defStyle) {
@H_404_13@super(context,attrs,defStyle);
init();
}
@Override
@H_404_13@public @H_404_13@void setOnTouchListener(OnTouchListener l) {
@H_404_13@this.l = l;
}
@Override
@H_404_13@public @H_404_13@void setOnFocusChangeListener(OnFocusChangeListener f) {
@H_404_13@this.f = f;
}
@H_404_13@private OnTouchListener l;
@H_404_13@private OnFocusChangeListener f;
@Override
@H_404_13@public @H_404_13@boolean onTouch(View v,MotionEvent event) {
@H_404_13@if (getCompoundDrawables()[2] != @H_404_13@null) {
@H_404_13@boolean tappedX = event.getX() > (getWidth() - getPaddingRight() - xD
.getIntrinsicWidth());
@H_404_13@if (tappedX) {
@H_404_13@if (event.getAction() == MotionEvent.ACTION_UP) {
setText("");
@H_404_13@if (listener != @H_404_13@null) {
listener.didClearText();
}
}
@H_404_13@return @H_404_13@true;
}
}
@H_404_13@if (l != @H_404_13@null) {
@H_404_13@return l.onTouch(v,event);
}
@H_404_13@return @H_404_13@false;
}
@Override
@H_404_13@public @H_404_13@void onFocusChange(View v,@H_404_13@boolean hasFocus) {
@H_404_13@if (hasFocus) {
setClearIconVisible(getText().length() > 0);
} @H_404_13@else {
setClearIconVisible(@H_404_13@false);
}
@H_404_13@if (f != @H_404_13@null) {
f.onFocusChange(v,hasFocus);
}
}
@Override
@H_404_13@public @H_404_13@void onTextChanged(CharSequence s,@H_404_13@int start,@H_404_13@int before,@H_404_13@int count) {
@H_404_13@if (isFocused()) {
setClearIconVisible(getText().length() > 0);
}
}
@Override
@H_404_13@public @H_404_13@void beforeTextChanged(CharSequence s,@H_404_13@int count,@H_404_13@int after) {
}
@Override
@H_404_13@public @H_404_13@void afterTextChanged(Editable s) {
}
@H_404_13@private @H_404_13@void init() {
xD = getCompoundDrawables()[2];
@H_404_13@if (xD == @H_404_13@null) {
xD = getResources()
.getDrawable(android.R.drawable.presence_offline);
}
xD.setBounds(0,0,xD.getIntrinsicWidth(),xD.getIntrinsicHeight());
setClearIconVisible(@H_404_13@false);
@H_404_13@super.setOnTouchListener(@H_404_13@this);
@H_404_13@super.setOnFocusChangeListener(@H_404_13@this);
addTextChangedListener(@H_404_13@this);
}
@H_404_13@protected @H_404_13@void setClearIconVisible(@H_404_13@boolean visible) {
@H_404_13@boolean wasVisible = (getCompoundDrawables()[2] != @H_404_13@null);
@H_404_13@if (visible != wasVisible) {
Drawable x = visible ? xD : @H_404_13@null;
setCompoundDrawables(getCompoundDrawables()[0],getCompoundDrawables()[1],x,getCompoundDrawables()[3]);
}
}
}
拓展:
loginPswEt.setTransformationMethod(HideReturnsTransformationMethod.getInstance());//隐藏密码
loginPswEt.setTransformationMethod(PasswordTransformationMethod.getInstance());//显示密码
此至!