布局文件使用相对布局 定义一个EditText drawableLeft属性加个搜索图标,属性imeOptions设置为actionSearch来更换软键盘的右下角建为搜索建。
android:id="@+id/et_query"
android:layout_width="match_parent"
android:layout_height="30dp"
android:drawableLeft="@mipmap/ic_search_api_mtrl"
android:imeOptions="actionSearch"
android:drawablePadding="8dp"
android:hint="查询单词"
android:background="@drawable/query_word_shape"
android:layout_marginRight="50dp"
android:layout_marginLeft="10dp"
android:layout_centerInParent="true"
android:layout_alignParentLeft="true"
android:singleLine="true"
android:textColor="#d1f57f"
/>
定义一个ImageView为×图标在EditText右边隐藏,以便后面监听EditText的文本改变事件时显示该叉号图标,点击图标可清空EditText文本内容。
定义一个ListView。创建数据源时使用两个集合,这里称为大集合和小集合。使用小集合作为数据源创建一个BaseAdapter用来设置给ListView。
//输入框添加文本变化监听器
et_query.addTextChangedListener(new TextWatcher() { @Override public void beforeTextChanged(CharSequence s, int start, int count, int after) { } @Override public void onTextChanged(CharSequence s, int start, int before, int count) { } //文本变化后 @Override public void afterTextChanged(Editable s) { if (s.length() > 0){ //文本内容大于0 iv_query_delete.setVisibility(View.VISIBLE); //显示删除按钮 list_word.clear(); //先清空lv集合数据 showListViewData(); //再添加数据 mAdapter.notifyDataSetChanged(); //通知lv更新 lv_query.setVisibility(View.VISIBLE); //显示listview ll_query_wordInfo.setVisibility(View.GONE); //隐藏单词信息 }else { iv_query_delete.setVisibility(View.GONE); //隐藏删除按钮 list_word.clear(); //清空集合数据 mAdapter.notifyDataSetChanged(); //通知lv更新 lv_query.setVisibility(View.VISIBLE); //显示listview ll_query_wordInfo.setVisibility(View.GONE); //隐藏单词信息 } } });
//将总集合里的数据里包含文本框的数据添加到ListView数据集合 private void showListViewData() { String data = et_query.getText().toString(); for (int i=0; i<list.size(); i++){ if (list.get(i).contains(data)){ list_word.add(list.get(i)); } } }
EditText设置文本变化监听器,addTextChangedListener来判断文本内容。如果内容长度大于0,则显示×叉图标,清空小集合以便每输入一个字符串重新显示数据,添加数据的方法中首先获取文本内容,如果大集合里的内容包含该文本内容则将大集合里的内容添加到小集合。适配器通知listview更新数据显示。
et_query.setOnEditorActionListener(new TextView.OnEditorActionListener() { @Override public boolean onEditorAction(TextView v, int actionId, KeyEvent event) { if (actionId == EditorInfo.IME_ACTION_SEARCH){ data = et_query.getText().toString(); if (list.contains(data)){ //设置单词信息 setWordInfo(); return false; }else { ll_query_wordInfo.setVisibility(View.GONE);//隐藏单词信息 lv_query.setVisibility(View.VISIBLE); //显示listView return true;//这里返回true表示方法回调完系统不需再处理。 } } return false; } });
文本框设置软键盘按钮监听器setOnEditorActionListener,如果actionId为搜索键,获取文本框内容,如果大集合包含该内容则设置信息并返回false将软键盘隐藏,否则返回true不隐藏软键盘。
et_query.setOnKeyListener(onKeyListener); //设置输入法软键盘右下角按钮监听器
//输入法软键盘返回键的监听器 private View.OnKeyListener onKeyListener = new View.OnKeyListener() { @Override public boolean onKey(View v, int keyCode, KeyEvent event) { if (keyCode == KeyEvent.KEYCODE_BACK && event.getAction() == KeyEvent.ACTION_DOWN) { list_word.clear(); Log.d("seven", "清空了哈哈哈哈"); return false; //这里返回的boolean类型表示是否还需要系统处理,false表示方法回调完系统再处理返回。 } return false; } };
文本框设置软键盘返回键的监听器,onKeyListener。如果keyCode为返回键,则清空小集合数据,防止在搜索中输入字符串后listview显示数据按了返回键后再回来查询时小集合有数据。并返回false,隐藏软键盘。
//隐藏软键盘 InputMethodManager manager = (InputMethodManager) mActivity.getSystemService(Context.INPUT_METHOD_SERVICE); if (manager.isActive()){ manager.hideSoftInputFromWindow(et_query.getWindowToken(), 0); }
获取InputMethodManager,调用hideSoftInputFromWindow,传入文本框的getWindowToken()、0即可。