很多时候,会有一些很简单的需求,比如你利用一个Button弹出某个页面,选择了某个对象之后,你会将对象的某些属性,比如名称之类,显示在按钮上。
而紧跟着,又会想着,能不能把刚选择的对象给清掉,比如把按钮上的文字给去掉,这个时候,你就会希望,要是按钮后面还能够有多一个图标,一点击,就把当前控件的文字等清除掉就好了,并且还会对应的回调函数,让我们多处理一些事情,那多好。
很可惜,Android并没有提供现成的控件供我们这样使用,但换个角度想想,这又根本不可惜,因为我们可以自己来实现这样的效果呀,这是多有意思的一件事情啊。
即使有时候,实现很简单,只是做多一点点事情,但当我们把它实现了,满足的感觉依然会油然而生啊,对吧!
现在想做的事情就很简单,想自定义一个控件,实现功能如下:
1)实现像Button一样的点击效果
2)又能够在后面添加一个删除小图标,可删除此控件上的内容
3)还要有一个响应函数,能够在删除之后做一些操作。
我们知道,自定义控件有多种方式,我们可以直接继承View,自己去画各种各样的UI,也可以简单地继承已存在的控件,比如Button就是继承TextView的一个简单的控件。
提到Button就是继承TextView的,而TextView又有CompoundDrawable的概念,那很显然,我们就可以利用TextView来实现我们的功能了。
太啰嗦了,还是先上代码吧
public class ClearableTextView extends TextView {
public interface OnTextClearListener {
public void onTextClear(ClearableTextView v);
}
private Context mContext;
private Drawable mDrawableRight;
private Rect mBounds;
private OnTextClearListener mOnTextClearListener;
public ClearableTextView(Context context) {
super(context);
initialize(context);
}
public ClearableTextView(Context context, AttributeSet attrs) {
super(context, attrs);
initialize(context);
}
private void initialize(Context context) {
mContext = context;
mDrawableRight = mContext.getResources().getDrawable(R.drawable.ic_delete);
mDrawableRight.setBounds(0, 0, mDrawableRight.getMinimumWidth(), mDrawableRight.getMinimumWidth());
setClickable(true);
setMinWidth(120);
setGravity(Gravity.CENTER_VERTICAL);
setPadding(8, 8, 8, 8);
setCompoundDrawableP