使用Edittext和greenDao实现模糊检索更新列表

前言

需要做一个根据Edittext文本变化模糊查询本地数据库,并更新列表的需求。
要求一:触摸键盘和Edittext外部的时候隐藏键盘。
要求二:默认Edittext图标居中,点击获取焦点之后图标居左,点击软键盘搜索按钮失去焦点,图标居中。

思考可能用到的知识点
  • Edittext添加文本变化监听addTextChangedListener
  • Activity的dispatchTouchEvent方法里记录当前坐标和获取焦点的View的关系,由此判断出是否要隐藏输入法。
  • 自定义Edittext并重写onFocusChange方法,根据焦点状态设置是否要让图标居中。
  • greenDao使用(可查看我之前一篇文章: greenDao使用记录)

先看看效果图

使用Edittext和greenDao实现模糊检索更新列表_第1张图片
使用Edittext和greenDao实现模糊检索更新列表_第2张图片

自定义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);
        }

    }
Demo地址

IconCenterEditTextDemo

你可能感兴趣的:(Android)