Android(安卓)自定义EditText, 增加设置右边取消按钮的属性
16lz
2021-01-24
想要使用android自带的editText的drawable实现右边取消按钮的设置,但是设置之后,drawableRight并没有点击事件,因此本文在继承editText的基础上增加 setClearDrawMode属性,可以直接在layout的xml文件中配置
实现上述功能,第一步在values下新建 attrs.xml文件
<?xml version="1.0" encoding="utf-8"?>
第二步新建UpEditText 继承EditText类
public class UpEditText extends AppCompatEditText { //setCompoundDrawable() 0 left, 1 top, 2 right, 3 bottom private static int LEFT = 0; private static int RIGHT= 2; private Context context; //EditText的显示模式 0 从不显示,1 当编辑的时候显示 private ClearDrawMode clearDrawMode; private int picId = R.drawable.cancel; public UpEditText(Context context) { super(context); init(context, null, 0); } public UpEditText(Context context, AttributeSet attrs) { super(context, attrs); init(context, attrs, 0); } public UpEditText(Context context, AttributeSet attrs, int defStyleAttr) { super(context, attrs, defStyleAttr); init(context, attrs, defStyleAttr); } private void init(Context context, AttributeSet attributeSet,int defStyleAttr){ this.context = context; TypedArray typedArray = context.obtainStyledAttributes(attributeSet, R.styleable.UpEditText); int attr = typedArray.getInteger(R.styleable.UpEditText_clearDrawMode,picId); typedArray.recycle(); switch (attr){ case 1: clearDrawMode = ClearDrawMode.WHILEEDITING; break; default: clearDrawMode = ClearDrawMode.NEVER; break; } this.setCompoundDrawables(null,null,null,null); } public enum ClearDrawMode{ NEVER, WHILEEDITING } @Override protected void onDraw(Canvas canvas) { super.onDraw(canvas); canvas.save(); buttonManager(); canvas.restore(); } public void buttonManager(){ switch (clearDrawMode){ case WHILEEDITING: if(hasFocus() && getText().length() > 0){ Drawable drawPicRight = getResources().getDrawable(R.drawable.cancel,null); drawPicRight.setBounds(1,1,60,60); this.setCompoundDrawables(null,null,drawPicRight,null); }else if(getText().length() == 0){ this.setCompoundDrawables(null,null,null,null); } break; default: this.setCompoundDrawables(null,null,null,null); break; } } @Override public boolean onTouchEvent(MotionEvent event) { switch (event.getAction()){ case MotionEvent.ACTION_UP: Drawable drawableRight = this.getCompoundDrawables()[RIGHT]; if (drawableRight != null && event.getRawX() >= (this.getRight() - (drawableRight.getBounds().width()) - getPaddingRight())){ this.setText(null); this.setCompoundDrawables(null,null,null,null); } break; } return super.onTouchEvent(event); } public void setClearDrawMode(ClearDrawMode clearDrawMode) { this.clearDrawMode = clearDrawMode; } public void setPicId(int picId) { this.picId = picId; }}
第三步,在activity的布局文件里
设置如下图所示 第一个画红色线的是布局文件里需要的,下面两个是给自定义的UpEditText定义自己增加取消按钮的属性值
然后再activity中添加代码
搞定
参考别人代码:
https://github.com/opprime/EditTextField(该代码是基于以前老的sdk写的)
更多相关文章
- 真实可行的android 基站定位代码
- Android个版本适配之7.0
- android如何对应用进行单元测试
- React Native 运行android程序报SDK文件不存在错误
- Android之路之十一(SharedPreferences&SQLite数据库)
- Android(安卓)中的TabHost控件的使用
- android文件系统挂载分析(1)---正常开机挂载
- Android反编译工具绿色版V2.0(改进版)
- Android之实现滑动开关组件