自定义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(

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
实现EditText文字输入飞入效果可以通过以下步骤: 1. 创建一个EditText控件,并设置输入监听器。 2. 在输入监听器中捕获EditText中的输入文本。 3. 创建一个TextView控件,并将捕获的输入文本设置为TextView的文本内容。 4. 将TextView控件添加到布局文件中,并设置其初始位置。 5. 创建一个动画对象,并设置动画持续时间、插值器等属性。 6. 将动画对象应用于TextView控件,使其飞入到指定位置。 7. 在动画结束监听器中将TextView控件移除。 以下是一个简单的示例代码: ``` mEditText.addTextChangedListener(new TextWatcher() { @Override public void beforeTextChanged(CharSequence s, int start, int count, int after) { } @Override public void onTextChanged(CharSequence s, int start, int before, int count) { String inputText = s.toString(); if (inputText.length() > 0) { TextView textView = new TextView(mContext); textView.setText(inputText); textView.setTextSize(16); textView.setTextColor(Color.BLACK); mContainer.addView(textView); AnimationSet animationSet = new AnimationSet(true); TranslateAnimation translateAnimation = new TranslateAnimation(0, 0, 0, -200); AlphaAnimation alphaAnimation = new AlphaAnimation(1.0f, 0.0f); animationSet.addAnimation(translateAnimation); animationSet.addAnimation(alphaAnimation); animationSet.setDuration(1000); animationSet.setInterpolator(new DecelerateInterpolator()); textView.startAnimation(animationSet); animationSet.setAnimationListener(new Animation.AnimationListener() { @Override public void onAnimationStart(Animation animation) { } @Override public void onAnimationEnd(Animation animation) { mContainer.removeView(textView); } @Override public void onAnimationRepeat(Animation animation) { } }); } } @Override public void afterTextChanged(Editable s) { } }); ``` 在这个示例代码中,mEditText是一个EditText控件,mContainer是一个FrameLayout布局容器。每当用户在EditText输入一个字符时,就会创建一个TextView控件并将其添加到mContainer中,然后将一个动画对象应用于TextView控件,使其飞入到指定位置,并在动画结束时将其移除。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值