前言
需要做一个根据Edittext文本变化模糊查询本地数据库,并更新列表的需求。
要求一:触摸键盘和Edittext外部的时候隐藏键盘。
要求二:默认Edittext图标居中,点击获取焦点之后图标居左,点击软键盘搜索按钮失去焦点,图标居中。
思考可能用到的知识点
- Edittext添加文本变化监听addTextChangedListener
- Activity的dispatchTouchEvent方法里记录当前坐标和获取焦点的View的关系,由此判断出是否要隐藏输入法。
- 自定义Edittext并重写onFocusChange方法,根据焦点状态设置是否要让图标居中。
- greenDao使用(可查看我之前一篇文章: greenDao使用记录)
先看看效果图
自定义Edittext
/**
* @author haizhuo
* @introduction 图标居中EditText
*/
public class IconCenterEditText extends AppCompatEditText implements View.OnFocusChangeListener{
/**
* 是否是默认图标再左边的样式
*/
private boolean isLeft = false;
public IconCenterEditText(Context context) {
this(context,null);
}
public IconCenterEditText(Context context, AttributeSet attrs) {
this(context, attrs,0);
}
public IconCenterEditText(Context context, AttributeSet attrs, int defStyleAttr) {
super(context, attrs, defStyleAttr);
setOnFocusChangeListener(this);
}
@Override
public void onFocusChange(View v, boolean hasFocus) {
isLeft = hasFocus;
}
@Override
protected void onDraw(Canvas canvas) {
if (isLeft) {
// 如果是默认样式,则直接绘制
super.onDraw(canvas);
} else {
// 如果不是默认样式,需要将图标绘制在中间
Drawable[] drawables = getCompoundDrawables();
if (drawables != null) {
Drawable drawableLeft = drawables[0];
if (drawableLeft != null) {
float textWidth = getPaint().measureText(getHint().toString());
int drawablePadding = getCompoundDrawablePadding();
int drawableWidth = drawableLeft.getIntrinsicWidth();
float bodyWidth = textWidth + drawableWidth + drawablePadding;
canvas.translate((getWidth() - bodyWidth - getPaddingLeft() - getPaddingRight()) / 2, 0);
}
}
super.onDraw(canvas);
}
}
}
部分代码
处理触摸
@Override
public boolean dispatchTouchEvent(MotionEvent event) {
if (event.getAction() == MotionEvent.ACTION_UP) {
View view=this.getCurrentFocus();
if (view!=null&&view instanceof IconCenterEditText){
int[] l = {0, 0};
view.getLocationInWindow(l);
int left = l[0], top = l[1], bottom = top + view.getHeight(), right = left
+ view.getWidth();
if (event.getX() > left && event.getX() < right && event.getY() > top && event.getY() < bottom) {
// 触摸的是IconCenterEditText控件,忽略它
} else {
KeyboardUtil.closeKeyboard(this);
}
}
}
return super.dispatchTouchEvent(event);
}
关闭键盘
/**
* 关闭键盘
*
* @param view
*/
public static void hideKeyBoard(Activity activity,View view) {
if (view != null) {
InputMethodManager inputMethodManager = (InputMethodManager)activity.getSystemService(Context.INPUT_METHOD_SERVICE);
inputMethodManager.hideSoftInputFromWindow(view.getWindowToken(), InputMethodManager.HIDE_NOT_ALWAYS);
}
}