我们的项目中很多的搜索功能都是通过SearchView来实现的,因为这个控件给我们封装了很多功能,也正因为这个,SearchView很多样式不好控制,比如输入框的背景图片,输入框的字体颜色等等!
不过如果看过源码的朋友就能轻松实现这些。ok,来看下SearchView的使用步骤

1、定义 menu.xml

<menu xmlns:android="http://schemas.android.com/apk/res/android"xmlns:app="http://schemas.android.com/apk/res-auto"xmlns:tools="http://schemas.android.com/tools"tools:context=".LauncherActivity"><item
          android:id="@+id/search_contact"android:title="搜索"app:showAsAction="always"   app:actionViewClass="android.support.v7.widget.SearchView"/>
</menu>

这个没什么可讲的,就和其他 menu 菜单项一样,唯一不同的是加入了

app:actionViewClass=”Android.support.v7.widget.SearchView”

2、获取 SearchView

@Override
public boolean onCreateOptionsMenu(Menu menu) {getMenuInflater().inflate(R.menu.menu_search, menu);final MenuItem item = menu.findItem(R.id.search_contact);mSearchView = (SearchView) MenuItemCompat.getActionView(item);return true;
}

通过MenuItem的兼容版MenuItemCompat获取SearchView;
获取了SearchView,我们就能设置其相应的属性,比如我想让它一开始就处于显示SearchView的状态

mSearchView.setIconified(false);

而我不想让它隐藏SearchView,则可以

mSearchView.setIconifiedByDefault(false);

mSearchView.setOnQueryTextListener(new SearchView.OnQueryTextListener() {@Overridepublic boolean onQueryTextSubmit(String query) {return false;}@Overridepublic boolean onQueryTextChange(String newText) {mSearchText = newText ;doSearch();return true;}
});

监听输入框变化和执行搜索操作后的回掉,所以我们可以在这里做相应的搜索功能。还有几个方法用的比较少,这里就不讲了,不过这些方法中确没有获取输入框的方法,无法获取输入框,那么我们就不能对其风格进行修改,不能改变输入框的背景,字体等等,这样看起来就和整个 app 的风格很不协调,而且每个系统显示的还不一样,这样是不应许的!

3、修改 SearchView 的样式

在第二点的时候,我们已经获取到了SearchView,可以通过源码找到其资源文件,然后通过 id 来获取相应的 view,比如获取输入框

mEdit = (SearchView.SearchAutoComplete) mSearchView.findViewById(R.id.search_src_text);

SearchView.SearchAutoComplete 其实就是输入框,它是继承之 EditView;

最后来看一个具体实例额

代码:

private void setSearchView() {final float density = getResources().getDisplayMetrics().density;mSearchView.setIconified(false);mSearchView.setIconifiedByDefault(false);final int closeImgId = context.getResources().getIdentifier("search_close_btn", "id", getPackageName());ImageView closeImg = (ImageView) mSearchView.findViewById(closeImgId);if (closeImg != null) {LinearLayout.LayoutParams paramsImg = (LinearLayout.LayoutParams) closeImg.getLayoutParams();paramsImg.topMargin = (int) (-2 * density);closeImg.setImageResource(R.mipmap.clear_img);closeImg.setLayoutParams(paramsImg);}final int editViewId = context.getResources().getIdentifier("search_src_text", "id", getPackageName());mEdit = (SearchView.SearchAutoComplete) mSearchView.findViewById(editViewId);if (mEdit != null) {mEdit.setHintTextColor(getResources().getColor(R.color.color_hint));mEdit.setTextColor(getResources().getColor(R.color.color_white));mEdit.setTextSize(TypedValue.COMPLEX_UNIT_SP, 16);mEdit.setHint(String.format(getResources().getString(R.string.search_hint_tip), MemoryData.departmentList.get(mPosition).getMembers().size()));}LinearLayout rootView = (LinearLayout) mSearchView.findViewById(R.id.search_bar);rootView.setBackgroundResource(R.drawable.edit_bg);rootView.setClickable(true);LinearLayout editLayout = (LinearLayout) mSearchView.findViewById(R.id.search_plate);LinearLayout.LayoutParams params = (LinearLayout.LayoutParams) editLayout.getLayoutParams();LinearLayout tipLayout = (LinearLayout) mSearchView.findViewById(R.id.search_edit_frame);LinearLayout.LayoutParams tipParams = (LinearLayout.LayoutParams) tipLayout.getLayoutParams();tipParams.leftMargin = 0;tipParams.rightMargin = 0;tipLayout.setLayoutParams(tipParams);ImageView icTip = (ImageView) mSearchView.findViewById(R.id.search_mag_icon);icTip.setImageResource(R.mipmap.ic_search_tip);params.topMargin = (int) (4 * density);editLayout.setLayoutParams(params);mSearchView.setSubmitButtonEnabled(false);mSearchView.setOnQueryTextListener(new SearchView.OnQueryTextListener() {@Overridepublic boolean onQueryTextSubmit(String query) {return false;}@Overridepublic boolean onQueryTextChange(String newText) {mSearchText = newText ;doSearch();return true;}});
}

这里还用了另外一种方法获取 id

closeImgId = context.getResources().getIdentifier(“search_close_btn”, “id”, getPackageName())

其实直接用 R.id.search_close_btn是一样的,没有区别!

总结:SearchView 的使用其实很简单,但是有的时候我们想要修改一点点样式却很难下手,这里重点就是说明如何获取每个 child view,通过 view 来改变其样式,
核心代码也就是

mEdit = (SearchView.SearchAutoComplete) mSearchView.findViewById(R.id.search_src_text);

最后附上资源文件

abc_search_view.xml

<?xml version="1.0" encoding="utf-8"?>
<!--
/** Copyright (C) 2014 The Android Open Source Project** Licensed under the Apache License, Version 2.0 (the "License");* you may not use this file except in compliance with the License.* You may obtain a copy of the License at**      http://www.apache.org/licenses/LICENSE-2.0** Unless required by applicable law or agreed to in writing, software* distributed under the License is distributed on an "AS IS" BASIS,* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.* See the License for the specific language governing permissions and* limitations under the License.*/-->
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"android:id="@+id/search_bar"android:layout_width="match_parent"android:layout_height="match_parent"android:orientation="horizontal"><!-- This is actually used for the badge icon *or* the badge label (or neither) --><TextView
            android:id="@+id/search_badge"android:layout_width="wrap_content"android:layout_height="match_parent"android:gravity="center_vertical"android:layout_marginBottom="2dip"android:drawablePadding="0dip"android:textAppearance="?android:attr/textAppearanceMedium"android:textColor="?android:attr/textColorPrimary"android:visibility="gone" /><android.support.v7.internal.widget.TintImageView
            android:id="@+id/search_button"style="?attr/actionButtonStyle"android:layout_width="wrap_content"android:layout_height="match_parent"android:layout_gravity="center_vertical"android:focusable="true"android:contentDescription="@string/abc_searchview_description_search" /><LinearLayout
            android:id="@+id/search_edit_frame"android:layout_width="wrap_content"android:layout_height="wrap_content"android:layout_weight="1"android:layout_gravity="center_vertical"android:layout_marginTop="4dip"android:layout_marginBottom="4dip"android:layout_marginLeft="8dip"android:layout_marginRight="8dip"android:orientation="horizontal"android:layoutDirection="locale"><android.support.v7.internal.widget.TintImageView
                android:id="@+id/search_mag_icon"android:layout_width="@dimen/abc_dropdownitem_icon_width"android:layout_height="wrap_content"android:scaleType="centerInside"android:layout_gravity="center_vertical"android:visibility="gone"style="@style/RtlOverlay.Widget.AppCompat.SearchView.MagIcon" /><!-- Inner layout contains the app icon, button(s) and EditText --><LinearLayout
                android:id="@+id/search_plate"android:layout_width="wrap_content"android:layout_height="wrap_content"android:layout_weight="1"android:layout_gravity="center_vertical"android:orientation="horizontal"><view class="android.support.v7.widget.SearchView$SearchAutoComplete"android:id="@+id/search_src_text"android:layout_height="36dip"android:layout_width="0dp"android:layout_weight="1"android:minWidth="@dimen/abc_search_view_text_min_width"android:layout_gravity="bottom"android:paddingLeft="@dimen/abc_dropdownitem_text_padding_left"android:paddingRight="@dimen/abc_dropdownitem_text_padding_right"android:singleLine="true"android:ellipsize="end"android:background="@null"android:inputType="text|textAutoComplete|textNoSuggestions"android:imeOptions="actionSearch"android:dropDownHeight="wrap_content"android:dropDownAnchor="@id/search_edit_frame"android:dropDownVerticalOffset="0dip"android:dropDownHorizontalOffset="0dip" /><android.support.v7.internal.widget.TintImageView
                    android:id="@+id/search_close_btn"android:layout_width="wrap_content"android:layout_height="match_parent"android:paddingLeft="8dip"android:paddingRight="8dip"android:layout_gravity="center_vertical"android:background="?attr/selectableItemBackgroundBorderless"android:focusable="true"android:contentDescription="@string/abc_searchview_description_clear" /></LinearLayout><LinearLayout
                android:id="@+id/submit_area"android:orientation="horizontal"android:layout_width="wrap_content"android:layout_height="match_parent"><android.support.v7.internal.widget.TintImageView
                    android:id="@+id/search_go_btn"android:layout_width="wrap_content"android:layout_height="match_parent"android:layout_gravity="center_vertical"android:paddingLeft="16dip"android:paddingRight="16dip"android:background="?attr/selectableItemBackgroundBorderless"android:visibility="gone"android:focusable="true"android:contentDescription="@string/abc_searchview_description_submit" /><android.support.v7.internal.widget.TintImageView
                    android:id="@+id/search_voice_btn"android:layout_width="wrap_content"android:layout_height="match_parent"android:layout_gravity="center_vertical"android:paddingLeft="16dip"android:paddingRight="16dip"android:background="?attr/selectableItemBackgroundBorderless"android:visibility="gone"android:focusable="true"android:contentDescription="@string/abc_searchview_description_voice" /></LinearLayout></LinearLayout>
</LinearLayout>

转自:http://blog.csdn.net/jxxfzgy/article/details/46055857

v7.widget.SearchView的使用相关推荐

  1. findViewById寻找SearchView控件导致程序崩溃 android.widget.SearchView cannot be cast to android.support.v7.widg

    searchView = (SearchView)findViewById(R.id.searchView); 程序莫名其妙崩溃 logcat查看程序日志 android.widget.SearchV ...

  2. Binary XML file line #8: Error inflating class android.support.v7.widget.RecyclerView

    今天创建了一个 demo ,然后就是复制RecyclerView 过去, 到最后完成运行的时候发现 系统奔溃了, 然后 提示 Binary XML file line #8: Error inflat ...

  3. AndroidStudio中提示:Didn‘t find class “android.support.v7.widget.RecyclerView“

    场景 在Android Studio中使用Recycle View时提示: Didn't find class "android.support.v7.widget.RecyclerView ...

  4. int android.support.v7.widget.RecyclerView$ViewHolder.mItemViewType' on a null.....

    今天在做一个即时通讯回话列表时,遇到int android.support.v7.widget.RecyclerView$ViewHolder.mItemViewType' on a null..空指 ...

  5. android.support.v7.widget.,关于android.support.v7.widget.RecyclerView的使用,总是找不到类...

    各位高手求指导决,卡在这了,整了一个上午没搞定. log输出: 06-13 00:42:03.395: E/AndroidRuntime(1884): FATAL EXCEPTION: main 06 ...

  6. Didn't find class android.support.v7.widget.RecyclerView 解决办法 ———————————————— 版权声明:本文为CSDN博主「eag

    依赖记得加:implementation 'com.android.support:recyclerview-v7:28.0.0' 你的可能是这样的 <android.support.v7.wi ...

  7. android recyclerView Binary XML file line #7: Error inflating class android.support.v7.widget.Recycl

    Binary XML file line #7: Error inflating class android.support.v7.widget.RecyclerView 原来在eclipse中使用R ...

  8. LayoutManager android.support.v7.widget.LinearLayoutManager@6eb337f is already attached to a Recycl

    java.lang.IllegalArgumentException: LayoutManager android.support.v7.widget.LinearLayoutManager@6eb3 ...

  9. 【Android】使用v7.widget.GridLayout做九宫格。

    布局文件 如果使用xml配置平分,那么配置大致如下: app:layout_rowWeight 垂直方向权重 app:layout_columnWeight 水平方向权重 app前缀是说明要使用v7所 ...

最新文章

  1. 零门槛!手把手教你打造AI应用
  2. S-D5舵机拆开看一看
  3. Java常见异常处理
  4. 使用vlc播放器做rtsp流媒体服务器
  5. 面向对象之反射和其他内置方法
  6. mysql中b树是什么_MySQL优化中B树索引知识点总结
  7. 强大的代码编辑工具:Nova for mac v7.3中文版
  8. 【翻译】Geometric Features-Based Parking Slot Detection
  9. PHP 安全检测代码片段
  10. linux下 根目录扩展
  11. CSS:字体设置~笔记
  12. C++ MFC人事管理系统
  13. QAM调制 - IQ正交调制及星座图
  14. Unity 安装个人免费版步骤详解
  15. 群晖套件中心没有docker_群晖中通过docker安装huginn
  16. Kinect+Unity实现虚拟人物动作同步
  17. 外卖优惠券返利分销系统外卖返利系统公众号小程序源码saas系统
  18. 洪强宁及其技术团队在网站架构
  19. JPEX联手西悉尼流浪者队 推出250款独家NFT“J-ball”
  20. 蔡徐坤鼓励师,你安装了吗?

热门文章

  1. 长三角地区经济发达,信息化基础设施程度高,5G、宽带等渗透率高
  2. 考虑风电经济调度的储能运行优化
  3. switch...case
  4. OrCAD利用Excel制作多引脚复杂元件的原理图库
  5. 如何彻底删除hao123的桌面快捷方式
  6. VC++多线程全面讲解
  7. 关系型数据之分区分表分库
  8. MBA联考-20101215
  9. Revit2020以及Revit2019安装以及激活配置教程
  10. python日志审计系统_日志审计系统