Android 带清空按钮的EditText

来源:互联网 发布:温州动车事故真相知乎 编辑:程序博客网 时间:2024/05/24 07:13

               源码

      有时候在注册时或遇到一些输入内容较长的EditText,输错内容删除慢是个问题,所以就需要来个clear按钮,我找到的这个是自定义的ClearEditText,内含EditText晃动动画代码,灰常实用。下面是使用方法:

1. ClearEditText.java

public class ClearEditText extends EditText implements          OnFocusChangeListener, TextWatcher { /** * 删除按钮的引用 */    private Drawable mClearDrawable;     /**     * 控件是否有焦点     */    private boolean hasFoucs;     public ClearEditText(Context context) {     this(context, null);     }      public ClearEditText(Context context, AttributeSet attrs) {     //这里构造方法也很重要,不加这个很多属性不能再XML里面定义    this(context, attrs, android.R.attr.editTextStyle);     }         public ClearEditText(Context context, AttributeSet attrs, int defStyle) {        super(context, attrs, defStyle);        init();    }        private void init() {     //获取EditText的DrawableRight,假如没有设置我们就使用默认的图片    mClearDrawable = getCompoundDrawables()[2];         if (mClearDrawable == null) { //        throw new NullPointerException("You can add drawableRight attribute in XML");        mClearDrawable = getResources().getDrawable(R.drawable.edittext_delete_selector);         }                 mClearDrawable.setBounds(0, 0, mClearDrawable.getIntrinsicWidth(), mClearDrawable.getIntrinsicHeight());         //默认设置隐藏图标        setClearIconVisible(false);         //设置焦点改变的监听        setOnFocusChangeListener(this);         //设置输入框里面内容发生改变的监听        addTextChangedListener(this);     }      /**     * 因为我们不能直接给EditText设置点击事件,所以我们用记住我们按下的位置来模拟点击事件     * 当我们按下的位置 在  EditText的宽度 - 图标到控件右边的间距 - 图标的宽度  和     * EditText的宽度 - 图标到控件右边的间距之间我们就算点击了图标,竖直方向就没有考虑     */    @Override public boolean onTouchEvent(MotionEvent event) {if (event.getAction() == MotionEvent.ACTION_UP) {if (getCompoundDrawables()[2] != null) {boolean touchable = event.getX() > (getWidth() - getTotalPaddingRight())&& (event.getX() < ((getWidth() - getPaddingRight())));if (touchable) {this.setText("");}}}return super.onTouchEvent(event);}     /**     * 当ClearEditText焦点发生变化的时候,判断里面字符串长度设置清除图标的显示与隐藏     */    @Override     public void onFocusChange(View v, boolean hasFocus) {     this.hasFoucs = hasFocus;        if (hasFocus) {             setClearIconVisible(getText().length() > 0);         } else {             setClearIconVisible(false);         }     }       /**     * 设置清除图标的显示与隐藏,调用setCompoundDrawables为EditText绘制上去     * @param visible     */    protected void setClearIconVisible(boolean visible) {         Drawable right = visible ? mClearDrawable : null;         setCompoundDrawables(getCompoundDrawables()[0],                 getCompoundDrawables()[1], right, getCompoundDrawables()[3]);     }         /**     * 当输入框里面内容发生变化的时候回调的方法     */    @Override     public void onTextChanged(CharSequence s, int start, int count,             int after) {             if(hasFoucs){            setClearIconVisible(s.length() > 0);            }    }      @Override     public void beforeTextChanged(CharSequence s, int start, int count,             int after) {              }      @Override     public void afterTextChanged(Editable s) {              }        /**     * 设置晃动动画     *///    public void setShakeAnimation(){//    this.setAnimation(shakeAnimation(5));//    }        /**     * 晃动动画     * @param counts 1秒钟晃动多少下     * @return     *///    public static Animation shakeAnimation(int counts){//    Animation translateAnimation = new TranslateAnimation(0, 10, 0, 0);//    translateAnimation.setInterpolator(new CycleInterpolator(counts));//    translateAnimation.setDuration(1000);//    return translateAnimation;//    } }
2. activity_main.xml

<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"    xmlns:tools="http://schemas.android.com/tools"    android:layout_width="match_parent"    android:layout_height="match_parent"    android:paddingBottom="@dimen/activity_vertical_margin"    android:paddingLeft="@dimen/activity_horizontal_margin"    android:paddingRight="@dimen/activity_horizontal_margin"    android:paddingTop="@dimen/activity_vertical_margin"    tools:context="com.fackquan.clearedittext.MainActivity" >    <com.fackquan.clearedittext.ClearEditText            android:id="@+id/activity_login_username"            android:layout_width="match_parent"            android:layout_height="wrap_content"            android:layout_marginTop="10dp"android:padding="15dp"            android:background="#fff"            android:ems="10"            android:gravity="center_vertical"            android:hint="请输入手机号"            android:inputType="number"            android:maxLength="11"            android:singleLine="true"            android:textColor="#000"            android:textSize="17sp" >            <requestFocus />        </com.fackquan.clearedittext.ClearEditText></RelativeLayout>
      其他的drawable文件和图片可以下载源码看看。除了清空按钮,针对密码输入框,可以控制密码的显示和隐藏,这个一般是在密码输入框右侧放一个SwitchButton(滑动开关),或者在输入框左下放CheckBox。CheckBox都会用,这个就不多搞了,下面粘主要代码,SwitchButton没怎么玩过,有空搞一下。

1. CheckBox (可以参考博客http://www.cnblogs.com/tinyphp/p/3964800.html)

checkBox1.setOnCheckedChangeListener(new OnCheckedChangeListener() {                        @Override            public void onCheckedChanged(CompoundButton buttonView, boolean isChecked) {                // TODO Auto-generated method stub                if(isChecked){                    //如果选中,显示密码                          editText1.setTransformationMethod(HideReturnsTransformationMethod.getInstance());                }else{                    //否则隐藏密码                    editText1.setTransformationMethod(PasswordTransformationMethod.getInstance());                }                            }        });
2. SwitchButton (可以参考博客http://blog.csdn.net/swust_chenpeng/article/details/19967501)

SwitchButton sb = (SwitchButton) findViewById(R.id.wiperSwitch1);          sb.setOnChangeListener(new OnChangeListener() {                            @Override              public void onChange(SwitchButton sb, boolean state) {                  // TODO Auto-generated method stub                  Log.d("switchButton", state ? "开":"关");                  Toast.makeText(MainActivity.this, state ? "开":"关", Toast.LENGTH_SHORT).show();              }          });  


0 0
原创粉丝点击