自定义EditText实现输入错误变红的效果

本文介绍如何自定义一个EditText,使其在输入错误时显示红色的底部线条、错误文字提示,并实现清除按钮。通过设置OnFocusChangeListener和TextWatcher监听输入状态,动态改变颜色和图片资源,以及错误提示的显示和隐藏。
摘要由CSDN通过智能技术生成

这次做的项目设计给的效果图是这样的

不选中时线为灰色,获取焦点后高亮变化,若判断错误后将底部线条文字及清楚按钮都变成红色,同时从界面上面要滑动出错误文字提示。

为了改变EditText线条颜色真是尝试了各种办法,但是小女子能力有限,最后用一种笨方法实现了。。

自定义了一个ClearEditText继承EditText实现onFocusChangeListener接口,在自定义view里大概做的事情就是

1、清除背景,注意版本判断

 if (Build.VERSION.SDK_INT>= Build.VERSION_CODES.JELLY_BEAN) {
            setBackground(
null);
       
} else {
            setBackgroundDrawable(
null);
       
}

2、重写onFocusChange方法,判断当前是错误状态还是正常状态,从而设置颜色及图片资源(其中正常状态时分选中和未选中直接使用selector定义一个xml文件即可)

@Override
   
public void onFocusChange(View v, booleanhasFocus) {
       
if(hasFocus&&this.getText().toString().trim().length()>0){
            setClearIconVisible(
true);//设置右侧清楚按钮为显示
       
}else{
            setClearIconVisible(
false);//不显示清楚按钮
       
}
       
if(!hasFocus && errorState){//若在显示错误样式时失去焦点,则变成正常状态
           
errorState=false;
           
showBottomLine(true);
       
}
    }

 /**
     * 设置清除图标的显示与隐藏,调用setCompoundDrawables为EditText绘制上去
     * @param
visible
    
*/
   
public void setClearIconVisible(booleanvisible) {
        Drawable right = visible ?
mClearDrawable : null;
       
setCompoundDrawables(getCompoundDrawables()[0],
               
getCompoundDrawables()[1],right, getCompoundDrawables()[3]);
   
}

  /**
     * 显示底部线条
     * @param
normal
    
*/
   
public void showBottomLine(booleannormal){
       
if(normal){//正常状态
            setTextColor(
textColor);
           
Drawable right = (getText().length() > 0) ? mClearDrawable: null;
           
setCompoundDrawables(getCompoundDrawables()[0],
                   
getCompoundDrawables()[1],right, mBottomLineNormal);
       
}else{//错误状态
            setTextColor(
textErrorColor);
           
setCompoundDrawables(getCompoundDrawables()[0],
                   
getCompoundDrawables()[1],mErrorClearDrawable, mBottomLineError);//在设置错误的红色底部线条时将右侧清楚按钮也换成红色X号图片
       
}
    }

注:其中drawable图片初始化时必须设置bounds否则不显示,用法如下

  mClearDrawable= getCompoundDrawables()[2];
        if
(mClearDrawable== null) {
           
mClearDrawable= getResources().getDrawable(R.drawable.search_clear);
       
}

mClearDrawable.setBounds(0,0, mClearDrawable.getIntrinsicWidth(),mClearDrawable.getIntrinsicHeight());//必须设置,否则不显示


3、设置TextWatcher,今天编辑内容发生变化后恢复正常状态

//设置输入框里面内容发生改变的监听
       
addTextChangedListener(newTextWatcher() {
           
/**
             * 当输入框里面内容发生变化的时候回调的方法
             */
           
@Override
           
public void onTextChanged(CharSequence s, intstart, int count,
                                      int
after) {
               
setClearIconVisible(s.length() > 0);
               show(s);
                if
(null !=errorView && errorView.getVisibility() == View.VISIBLE) {//若设置了自定义的屏幕上方的view且为显示状态则隐藏
                   
errorView.clearErrorMessage();
               
}
               
if(errorState){
                   
errorState=false;
                   
showBottomLine(true);//设置文字颜色、底部和右侧图片为正常状态的图片
               
}
            }
           
@Override
           
public void beforeTextChanged(CharSequence s, intstart, int count,  intafter) {
            }
           
@Override
           
public void afterTextChanged(

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值