一个简单的搜索输入框

今天我们来看一个简单的搜索输入框。

为了简单起见,直接继承EditTextView,重写构造方法,这里我们提供三个构造(参数分别为一个,两个,三个,通常提供前两个 就够了)。

public EditTextWithSearch(Context context) {
        super(context);
        mContext = context;
        init();
    }

    public EditTextWithSearch(Context context, AttributeSet attrs, int defStyle) {
        super(context, attrs, defStyle);
        mContext = context;
        init();
    }

    public EditTextWithSearch(Context context, AttributeSet attrs) {
        super(context, attrs);
        mContext = context;
        init();
    }


接下来,我们在输入框右侧加入搜索图标元素,设置字体大小,背景等。

private void init() {
        searchImg = mContext.getResources().getDrawable(R.mipmap.nu_ic_search);
        setCompoundDrawablesWithIntrinsicBounds(null, null, searchImg, null);
        setBackgroundResource(R.drawable.nu_input_frame);
        setTextSize(16);
        LinearLayout.LayoutParams linearParams = new LinearLayout.LayoutParams(LinearLayout.LayoutParams.WRAP_CONTENT, 34);
        setLayoutParams(linearParams);
        setHintTextColor(Color.parseColor("#B6B6B6"));
        setSearch();
    }


注意一下设置图片元素的方法,最后一行代码为设置搜索行为。

对于搜索行为,我们期望有两个地方可以出发,一是点击搜索图标,二是软键盘的回车键。

对于前者,重写onTouchEvent():

@Override
    public boolean onTouchEvent(MotionEvent event) {
        if (searchImg != null && event.getAction() == MotionEvent.ACTION_UP) {
            int eventX = (int) event.getRawX();
            int eventY = (int) event.getRawY();
            Rect rect = new Rect();
            getGlobalVisibleRect(rect);
            rect.left = rect.right - 50;
            if (rect.contains(eventX, eventY) && searchListener != null) {
                searchListener.onSearch(getText().toString());
            }
        }
        return super.onTouchEvent(event);
    }

我们知道,onTouchEvent()参数中的MotionEvent类包含了点击事件的相关信息,可以获取点击坐标及点击事件类型等,这里,我们通过设定触发搜索行为的条件为:
点击坐标在规定视图范围内,这里我们通过getGlobalVisibleRect方法获取可视区域的视图,再限定rect大小,从而锁定搜索图标及周围区域。

对于后者,更改软键盘的回车键图标,并对其设置监听。

private void setSearch() {
        setInputType(InputType.TYPE_CLASS_TEXT);
        setImeOptions(EditorInfo.IME_ACTION_SEARCH);
        setImeActionLabel("搜索", getImeActionId());
        setOnKeyListener(new OnKeyListener() {

            @Override

            public boolean onKey(View v, int keyCode, KeyEvent event) {

                if (keyCode == KeyEvent.KEYCODE_ENTER && searchListener != null) {
                    searchListener.onSearch(getText().toString());
                }
                return false;
            }
        });
    }

最后,我们对外提供注册监听方法及接口原型。

public void setSearchListener(SearchListener searchListener) {
        this.searchListener = searchListener;
    }

    public interface SearchListener {
        void onSearch(String text);
    }


还有一点需要说明的是,为了使我们的搜索框看起来更有立体感,背景应使用.9.png格式的图片资源。



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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值