一个简单的搜索输入框

来源:互联网 发布:html数据展示表格模板 编辑:程序博客网 时间:2024/05/22 16:44

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

为了简单起见,直接继承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