今天我们来看一个简单的搜索输入框。
为了简单起见,直接继承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);
}