自定义EditText,带删除按键

带清空按键,还可左右加图片,默认的是加了清空图片。

清空内容是判断的手势点击EditText的范围。

自定义EditText代码如下:

import android.content.Context;
import android.graphics.drawable.Drawable;
import android.text.Editable;
import android.text.TextUtils;
import android.text.TextWatcher;
import android.util.AttributeSet;
import android.view.MotionEvent;
import android.view.View;
import android.widget.EditText;

/**
 * Created by Administrator on 2014/9/15.
 */

    public class ClearEditText extends EditText implements TextWatcher,
        View.OnFocusChangeListener {

        /**
         * 左右两侧图片资源
         */
        private Drawable left, right;
 
        /** 
         * 添加 ClearListener 可以实现搜索下面界面数据的清空
         */ 
        private ClearListener mClearListener;
        /**
         * 是否获取焦点,默认没有焦点
         */
        private boolean hasFocus = false;
        /**
         * 手指抬起时的X坐标
         */
        private int xUp = 0;

        private boolean hasMyListener = false;

        public interface ClearListener{
            public void doChange();
        }

       public void setMyListener(ClearListener clearListener){

        mClearListener = clearListener;
        hasMyListener = true;
       }

    public ClearEditText(Context context) {
            this(context, null);
        }

        public ClearEditText(Context context, AttributeSet attrs) {
            this(context, attrs, android.R.attr.editTextStyle);
        }

        public ClearEditText(Context context, AttributeSet attrs, int defStyle) {
            super(context, attrs, defStyle);
            initWedgits();
        }

        private void initWedgits() {
            try {
                // 获取drawableLeft图片,如果在布局文件中没有定义drawableLeft属性,则此值为空
                left = getCompoundDrawables()[0];
                // 获取drawableRight图片,如果在布局文件中没有定义drawableRight属性,则此值为空
                right = getCompoundDrawables()[2];
                initDatas();
            } catch (Exception e) {
                e.printStackTrace();
            }
        }

        /**
         * 初始化数据
         */
        private void initDatas() {
            try {
                // 第一次显示,隐藏删除图标
                setCompoundDrawablesWithIntrinsicBounds(left, null, null, null);
                addListeners();
            } catch (Exception e) {
                e.printStackTrace();
            }
        }

        /**
         * 添加事件监听
         */
        private void addListeners() {
            try {
                setOnFocusChangeListener(this);
                addTextChangedListener(this);
            } catch (Exception e) {
                e.printStackTrace();
            }
        }

        @Override
        public void beforeTextChanged(CharSequence s, int start, int count,
                                      int after) {
        }

        @Override
            public void onTextChanged(CharSequence s, int start, int before, int after) {
                if (hasFocus) {
                    if (TextUtils.isEmpty(s)) {
                        // 如果为空,则不显示删除图标
                        setCompoundDrawablesWithIntrinsicBounds(left, null, null, null);

                        if(hasMyListener){
                            mClearListener.doChange();
                        }
                    } else {
                        // 如果非空,则要显示删除图标
                        if (null == right) {
                            right = getCompoundDrawables()[2];
                        }
                        setCompoundDrawablesWithIntrinsicBounds(left, null, right, null);
                    }
                }
        }

    @Override
        public boolean onTouchEvent(MotionEvent event) {
            try {
                switch (event.getAction()) {
                    case MotionEvent.ACTION_UP:
                        // 获取点击时手指抬起的X坐标
                        xUp = (int) event.getX();
                        // 当点击的坐标到当前输入框右侧的距离小于等于getCompoundPaddingRight()的距离时,则认为是点击了删除图标
                        // getCompoundPaddingRight()的说明:Returns the right padding of the view, plus space for the right Drawable if any.
                        if ((getWidth() - xUp) <= getCompoundPaddingRight()) {
                            if (!TextUtils.isEmpty(getText().toString())) {
                                setText("");
                            }
                        }
                        break;
                    default:
                        break;
                }
            } catch (Exception e) {
                e.printStackTrace();
            }
            return super.onTouchEvent(event);
        }

        @Override
        public void afterTextChanged(Editable s) {
        }

        @Override
        public void onFocusChange(View v, boolean hasFocus) {
            try {
                this.hasFocus = hasFocus;
            } catch (Exception e) {
                e.printStackTrace();
            }
        }
    }

布局见中的实现:

<com.tuge.zonghengda_vector.widget.ClearEditText
              android:layout_toLeftOf="@id/search_button"
              android:layout_width="match_parent"
              android:layout_height="40dp"
              android:layout_centerVertical="true"
              android:layout_marginLeft="8dp"
              android:layout_marginRight="8dp"
              android:paddingLeft="8dp"
              android:paddingRight="8dp"
              android:hint="请输入运单号或订舱号"
              android:drawablePadding="8dp"
              android:textSize="16sp"
              android:textColorHint="#ffa9a9a9"
              android:singleLine="true"
              android:id="@+id/search_editText"
              android:drawableLeft="@drawable/ico_search_small"
              android:drawableRight="@drawable/text_clear_selector"
              android:background="@drawable/search_background"/>

ico_search_small:

text_clear_selector:

<?xml version="1.0" encoding="utf-8"?>

<selector xmlns:android="http://schemas.android.com/apk/res/android">
    <item android:drawable="@drawable/ico_text_clear"/>
    <item android:drawable="@drawable/ico_text_clear_click"
          android:state_pressed="true"/>
    <item   android:state_focused="true" android:drawable="@drawable/ico_text_clear_click"/>

</selector>

ico_text_clear_click:

最后在代码中获取即可。

时间: 2024-10-08 13:48:35

自定义EditText,带删除按键的相关文章

自定义组件------带删除功能的EditText

以前在为EditText添加左侧图标,以及右侧一个删除按钮时,经常是使用FrameLayout,当这样代码复用差,维护也麻烦.最好的方法是重写EditText实现该功能.现在看看效果图,后面再讲解实现方式. 重写之后的组件有如下功能,只有当EditText内容不为空,而且获得焦点,才会出现删除按钮,点击删除按钮则清空内容.代码如下: public class CleanableEditText extends EditText { //回调函数 private TextWatcherCallBa

自定义EditText实现一键删除数据

转载请注明出处http://blog.csdn.net/xiaanming/article/details/11066685 自定义EditText带删除小图标, 实现的功能: 点击删除小图标,删除当前输入框中所有内容 删除图标默认不显示,当输入框获得焦点后显示, 实现的操作: 在Edittext的DrawableRight中添加一张删除图标,作为删除功能的小图标 因为Edittext不能为图片设置点击监听事件,因此我们需要自定义Edittext在onTouchEvent方法中模拟按钮点击的操作

【Android-EditText】自定义带删除功能的EditText

我们经常在一些应用中见到输入框带有删除功能,今天我们就来实现这个功能(文字组织能力不强,大家随便看看).主要是记录一下自己的学习经历,如果对大家有帮助,我会更开心的. 先上图: 实现要点: 1.当输入框为空时,删除按钮隐藏: 2.当输入框不为空时,显示删除按钮. 核心代码: package com.example.view; import com.example.ui.R; import android.content.Context; import android.graphics.Rect;

Android 自定义EditText输入框 带清空按钮

总结  Android 自定义EditText输入框 带清空按钮 当用户输入字符后  EditText会自动在输入框的内部右侧出现删除按钮 重写EditText达到简化布局的效果 效果图: 继承EditText package com.example.myedittexttest; import android.content.Context; import android.graphics.Rect; import android.graphics.drawable.Drawable; imp

35.Android之带删除按钮EditText学习

今天实现Android里自定义带删除功能的EditText,效果如下: 当输入内容时,EditText变为带有一个删除功能按钮的编辑框,如图: 实现代码很简单,直接上代码, 布局文件xml: 1 <?xml version="1.0" encoding="utf-8"?> 2 <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" 3 an

Android 带清除 和 晃动效果的 自定义 EditText 解析

转载请标明出处 :http://blog.csdn.net/qq_19986309 尊重他人劳动成果~ 谢谢 今天给大家实现一个 带清除按钮  和 晃动效果的 自定义 EditText 常常大家写登录 注册按钮 可能是需要用到的, 好了 废话不多说 直接上效果图 这样的效果还是不错的  也是比较实用 不管在哪里的注册登录都用得着 下面贴下代码 public class ClearWriteEditText extends EditText implements View.OnFocusChang

自定义EditText 实现带清空按钮的输入框

注:本文转载自csdn,其中实现清除功能所采用的方案比较可取. 原文如下: 项目要求:做出包含根据情况可变色的下划线,左侧有可变图标,右侧有可变删除标志的edittext,如图 记录制作过程: 第一版本: 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52

LayoutInflater作用及使用--自定义EditText,自带清除内容按钮

作用: 1.对于一个没有被载入或者想要动态载入的界面, 都需要使用inflate来载入. 2.对于一个已经载入的Activity, 就可以使用实现了这个Activiyt的的findViewById方法来获得其中的界面元素. 举例:定义了一个控件类CleanableEditText,实现在焦点变化时和输入内容发生变化时均要判断是否显示右边clean图标   后台调用自定义控件的时候需要LayoutInflater来载入(见第三段代码). 自定义控件: package com.utils; impo

带删除的edittext

1 package com.sixin.view; 2 3 import android.content.Context; 4 import android.graphics.Canvas; 5 import android.graphics.Color; 6 import android.graphics.Paint; 7 import android.graphics.Rect; 8 import android.graphics.drawable.Drawable; 9 import an