Android 实现自定义自带删除按钮的EditText(带有搜索接口)
来源:互联网 发布:震动报警器单片机程序 编辑:程序博客网 时间:2024/05/21 04:23
Android 实现自定义自带删除按钮的EditText(带有搜索接口)
一、效果图:
二、实现代码:
MFCleanEditText.java
package cn.zszh.customs.view;import android.content.Context;import android.graphics.Canvas;import android.graphics.Rect;import android.graphics.drawable.Drawable;import android.text.Editable;import android.text.TextWatcher;import android.util.AttributeSet;import android.view.MotionEvent;import android.view.View;import android.view.View.OnTouchListener;import android.view.View.OnFocusChangeListener;import android.widget.EditText;import android.widget.Toast;/** * @说明: 自定义多功能带删除按钮的EditText:(可以具有搜索功能) * @author zszh * */public class MFCleanEditText extends EditText implements TextWatcher,OnFocusChangeListener{private Drawable mClearDrawable;//保存 EditText右侧的删除按钮 private boolean hasFoucs; //保存控件是否获取到焦点private OnClickListener mListener;//自定义点击监听器private boolean isFirst=true;//判断是否是第一次加载public MFCleanEditText(Context context) {this(context,null);}public MFCleanEditText(Context context, AttributeSet attrs) {//必须使用android.R.attr.editTextStyle,否则失去本有的功能this(context, attrs,android.R.attr.editTextStyle);}public MFCleanEditText(Context context, AttributeSet attrs, int defStyle) {super(context, attrs, defStyle);init();//用于设置}private void init(){// 获取EditText的DrawableRight,假如没有设置我们就使用默认的图片,获取图片的顺序是左上右下(0,1,2,3,)mClearDrawable = getCompoundDrawables()[2]; //保存 右侧按钮// 默认设置隐藏图标 setClearIconVisible(false); // 设置焦点改变的监听 setOnFocusChangeListener(this); // 设置输入框里面内容发生改变的监听 addTextChangedListener(this);}/** * @说明:isInnerWidth, isInnerHeight为ture,触摸点在删除图标之内,则视为点击了删除图标 * event.getX() 获取相对应自身左上角的X坐标 * event.getY() 获取相对应自身左上角的Y坐标 * getWidth() 获取控件的宽度 * getHeight() 获取控件的高度 * getTotalPaddingRight() 获取删除图标左边缘到控件右边缘的距离 * getPaddingRight() 获取删除图标右边缘到控件右边缘的距离 * isInnerWidth: * getWidth() - getTotalPaddingRight() 计算删除图标左边缘到控件左边缘的距离 * getWidth() - getPaddingRight() 计算删除图标右边缘到控件左边缘的距离 * isInnerHeight: * distance 删除图标顶部边缘到控件顶部边缘的距离 * distance + height 删除图标底部边缘到控件顶部边缘的距离 */@Overridepublic boolean onTouchEvent(MotionEvent event) {if (event.getAction() == MotionEvent.ACTION_UP) { int x = (int)event.getX(); int y = (int)event.getY(); if (getCompoundDrawables()[2] != null) { //清除按钮存在时Rect rect = getCompoundDrawables()[2].getBounds(); int height = rect.height(); //按钮高int distance = (getHeight() - height)/2; //按钮距离上边缘(下边缘)的距离boolean isInnerWidth = x > (getWidth() - getTotalPaddingRight()) && x < (getWidth() - getPaddingRight()); boolean isInnerHeight = y > distance && y <(distance + height); if (isInnerWidth && isInnerHeight) { this.setText(""); //清除} } if(getCompoundDrawables()[0] != null){//左侧按钮存在Rect rect = getCompoundDrawables()[0].getBounds();int height = rect.height(); //按钮高int distance = (getHeight() - height)/2; //按钮距离上边缘(下边缘)的距离boolean isInnerWidth = x < getTotalPaddingLeft() && x > getPaddingLeft(); boolean isInnerHeight = y > distance && y < (distance + height); if (isInnerWidth && isInnerHeight) { //TODO 左侧按钮被点击if(mListener != null){//自定义点击监听器mListener.onClickLeft(getCompoundDrawables()[0]);}} }}return super.onTouchEvent(event);}@Overridepublic void beforeTextChanged(CharSequence s, int start, int count,int after) {}@Overridepublic void afterTextChanged(Editable s) {}@Overridepublic void onTextChanged(CharSequence s, int start,int count, int after) {if (hasFoucs) { setClearIconVisible(s.length() > 0); } }/** * 当MFCleanEditText焦点发生变化的时候, * 输入长度为零或没有焦点时,隐藏删除图标;否则,显示删除图标 */ @Overridepublic void onFocusChange(View v, boolean hasFocus) {this.hasFoucs=hasFocus;if(hasFocus){setClearIconVisible(getText().length()>0);}else{setClearIconVisible(false);}}protected void setClearIconVisible(boolean visible) { Drawable right = visible ? mClearDrawable : null; setCompoundDrawables(getCompoundDrawables()[0], getCompoundDrawables()[1], right, getCompoundDrawables()[3]); }public interface OnClickListener {void onClickLeft(Object obj);}public void setOnClickListener(OnClickListener listener){mListener=listener;}@Overrideprotected void onDraw(Canvas canvas) {if(isFirst){//只执行一次setDrawableBound();isFirst=false;}super.onDraw(canvas);}/** * 重新设置DrawableLeft、DrawableTop、DrawableRight、DrawableBottom的布局 */private void setDrawableBound(){int padding=getPaddingRight();int rectBound=getHeight()-2*padding;Rect rect=new Rect();if(mClearDrawable!=null){rectBound=Math.min(getHeight()-2*padding, mClearDrawable.getIntrinsicWidth());rect.set(0, 0, rectBound, rectBound);mClearDrawable.setBounds(rect); //右}Drawable left=getCompoundDrawables()[0];Drawable top=getCompoundDrawables()[1];Drawable bottom=getCompoundDrawables()[3];if(left != null){rectBound=Math.min(getHeight()-2*padding, left.getIntrinsicWidth());rect.set(0, 0, rectBound, rectBound);left.setBounds(rect);}if(top != null){rectBound=Math.min(getHeight()-2*padding, top.getIntrinsicWidth());rect.set(0, 0, rectBound, rectBound);left.setBounds(rect);}if(bottom != null){rectBound=Math.min(getHeight()-2*padding, bottom.getIntrinsicWidth());rect.set(0, 0, rectBound, rectBound);left.setBounds(rect);}setClearIconVisible(getText().length()>0);}}
到此,完成自定义自带删除功能的EditText控件。
阅读全文
0 0
- Android 实现自定义自带删除按钮的EditText(带有搜索接口)
- Android自定义View带有删除按钮的EditText
- 自定义带删除按钮的EditText搜索框
- 自定义控件--带有删除按钮的EditText
- Android自定义控件实现带有清除按钮的EditText
- Android带有删除按钮的EditText:EditTextWithDeleteButton
- Android 自定义带有清除按钮的Edittext
- Android EditText 自定义带删除按钮
- android自定义控件(组合控件)--带删除按钮的EditText
- Android自定义右边带删除按钮的EditText
- Android自定义带删除按钮的输入框EditText
- Android自定义View-带删除和搜索图标的EditText
- 自定义带删除按钮的EditText
- 自定义带删除按钮的EditText
- 自定义控件 带删除按钮的EditText
- 自定义View(二)自带清楚按钮的EditText
- Android EditText 自带清除按钮 (ViewGroup实现)
- 自定义EditText(带删除按钮)
- 图片上传
- HDU
- BeagleBone Black 3
- Android图片之Glide
- javascript的正则如何传递一个变量
- Android 实现自定义自带删除按钮的EditText(带有搜索接口)
- 触发器和存储
- 当前记录被另一用户锁定,解除锁定
- 文件处理命令tail
- JavaWeb--基础进阶《二》:Java基础-变量与数据类型
- 华为麦芒 6 上手评测:能否继续麦芒 5 的辉煌?
- 翻译 | 关键CSS和Webpack: 减少阻塞渲染的CSS的自动化解决方案
- QNX配置网卡
- 汉诺塔问题分析