这次做的项目设计给的效果图是这样的
不选中时线为灰色,获取焦点后高亮变化,若判断错误后将底部线条文字及清楚按钮都变成红色,同时从界面上面要滑动出错误文字提示。
为了改变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(