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

前言

需要做一个根据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);
        }

    }
Demo地址

IconCenterEditTextDemo

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值