- 简单的使用
- 修改样式
- 获取焦点相关
使用
- 布局文件:
要注意 android.widget
和 android.support.v7.widget
包里的用法是不太一样的。
特别是 android.support.v7.widget.SearchView
需要父布局 id 设为 search_edit_frame
否则会报错:
- 添加监听
// 设置搜索文本监听
mSearchView.setOnQueryTextListener(new SearchView.OnQueryTextListener() {
// 当点击搜索按钮时触发该方法
@Override
public boolean onQueryTextSubmit(String query) {
return false;
}
// 当搜索内容改变时触发该方法
@Override
public boolean onQueryTextChange(String newText) {
if (!TextUtils.isEmpty(newText)){
}else{
}
return false;
}
});
- 其他重要的方法
setIconifiedByDefault(boolean);//图标是否显示在搜索框内
setImeOptions(int);//输入法搜索选项字段,默认是搜索
setInputType(int);//输入类型
setMaxWidth(int);//最大宽度
setQueryHint(CharSequence);//提示字符串
- 对应的 xml 属性
android:iconifiedByDefault
android:imeOptions
android:inputType
android:maxWidth
android:queryHint
改变样式
SearchView 里集合了若干个 View,我们可以先获取到指定 View 的 id
根据 id 获取 View 的实例,以此改变样式
-
获取搜索图标的 id,用 id 获取实例来更换图片。
int imgId = mSearchView.getContext().getResources()
.getIdentifier("android:id/search_mag_icon",null,null);
ImageView imageView = (ImageView)mSearchView.findViewById(imgId);
if (imageView != null){
imageView.setImageResource(R.drawable.ic_location);
}
- 去掉输入框的下划线
int plateId = mSearchView.getContext().getResources()
.getIdentifier("android:id/search_plate",null,null);
View plate = mSearchView.findViewById(plateId);
plate.setBackgroundResource(R.color.white);
至于其他的 View 的 id 获取的方式,只要点进源码查看就可以了:
更多
实际上 SearchView 里有一个 SearchAutoComplete 完成搜索提示 / 历史记录的功能:
具体见于 Android SearchView的高级用法,解决关于SearchView的样式与控制问题
获取焦点的相关问题
- 取消默认自动获取焦点
似乎有几种方法都可以做到,例如设置 SearchView 的父控件的属性
android:focusable
和 android:focusableInTouchMode
设为 true
或者在 OnResume()
中设置:
mSearchView.setFocusable(true);
mSearchView.setFocusableInTouchMode(true);
//mSearchView.requestFocus(); //获取焦点
- 关闭软键盘
//如果软键盘已经出现则关闭软键盘
View view = getActivity().getWindow().peekDecorView();
if (view != null) {
InputMethodManager inputMethodManager = (InputMethodManager) getActivity()
.getSystemService(Context.INPUT_METHOD_SERVICE);
inputMethodManager.hideSoftInputFromWindow(view.getWindowToken(), 0);
}