Android actionbar 搜索框

就是实现在顶部这样的搜索框。

一、这个搜索框是actionbar上的menu上的一个item.叫SearchView.我们可以先在menu选项里定义好:

bmap_menu.xml:

<?xml version="1.0" encoding="utf-8"?>
<menu xmlns:android="http://schemas.android.com/apk/res/android"
    >
      <item
        android:id="@+id/menu_search"
        android:icon="@android:drawable/ic_menu_search"
        android:title="@string/action_search"
        android:actionViewClass="android.widget.SearchView"
        android:showAsAction="ifRoom|collapseActionView" />
</menu>

这里showAsAction的collapseActionView 表示允许将searchView扩展到整个actionbar.

二、配置searchble:

Search View 可以看作seachble activity在acionbar 的一种快捷入口的标识。那么我们可以通过配置searchble 配置相关的信息:

在res/xml文件夹下(如果没有xml文件夹,就新建一个),新建文件:searchable.xml

<?xml version="1.0" encoding="utf-8"?>
<searchable xmlns:android="http://schemas.android.com/apk/res/android"
  android:label="@string/search_label"
    android:hint="@string/search_hint"
/>

三、配置AndroidManifest.xml

既然searchview是一个入口标识,那么久需要在AndroidManifest.xml文件里配置过滤:

<activity android:name="cn.com.smartcost.cld.ui.BmapActivity"
         >
          <intent-filter>
                <action android:name="android.intent.action.SEARCH"/>

            </intent-filter> 

          <meta-data android:name="android.app.searchable" android:resource="@xml/searchable"/>
</activity> 

四、searchView 加载searchble 配置信息 :

public boolean onCreateOptionsMenu(Menu menu) {
    // 加入含有search view的菜单
    MenuInflater inflater = getMenuInflater();
    inflater.inflate(menuId, menu);
    // 获取SearchView对象
    SearchView searchView = (SearchView) menu.findItem(R.id.menu_search).getActionView();
    if(searchView == null){
        Log.e("SearchView","Fail to get Search View.");
        return true;
    }
    searchView.setIconifiedByDefault(true); // 缺省值就是true,可能不专门进行设置,false和true的效果图如下,true的输入框更大

   // 获取搜索服务管理器
    SearchManager searchManager = (SearchManager) getSystemService(Context.SEARCH_SERVICE);
    // searchable activity的component name,由此系统可通过intent进行唤起
    ComponentName cn = new ComponentName(this,SearchResultActvity.class);
    // 通过搜索管理器,从searchable activity中获取相关搜索信息,就是searchable的xml设置。如果返回null,表示该activity不存在,或者不是searchable
    SearchableInfo info = searchManager.getSearchableInfo(cn);
    if(info == null){
        Log.e("SearchableInfo",Fail to get search info.");
    }
    // 将searchable activity的搜索信息与search view关联
    searchView.setSearchableInfo(info); 

    return true;
} 

五、响应搜索的activity:

public class BmapActivity extends Activity{
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        … …
        doSearchQuery(getIntent());
    } 

    @Override
    protected void onNewIntent(Intent intent) {  //activity重新置顶
        super.onNewIntent(intent);
        doSearchQuery(intent);
    } 

    // 对searchable activity的调用仍是标准的intent,我们可以从intent中获取信息,即要搜索的内容
    private void doSearchQuery(Intent intent){
        if(intent == null)
            return; 

        String queryAction = intent.getAction();
        if( Intent.ACTION_SEARCH.equals( intent.getAction())){  //如果是通过ACTION_SEARCH来调用,即如果通过搜索调用
            String queryString = intent.getStringExtra(SearchManager.QUERY); //获取搜索内容
            … …
        }  

    }
    … …
}

另外,有几个需求:

1.如何改变默认搜索框底下的那条横线的颜色,这个看似容易,其实很麻烦,如果直接设置背景图片的话,很可能会造成叠加的情况。网上看了overflow论坛的人的方法,觉得都不太理想,有人提出 用反射的方法解决,我也是采用反射的办法:

		try{
			Class<?> argClass=searchView.getClass();  

            Field ownField = argClass.getDeclaredField("mSearchPlate");
            //setAccessible
            ownField.setAccessible(true);
            View mView = (View) ownField.get(searchView);
            mView.setBackground(getResources().getDrawable(R.drawable.test));
		}catch(Exception e){
			e.printStackTrace();
		}

但是这样的有一个问题,假如你的searchView有一个submit的话,那么仅仅是搜索框底下的那条横线变色了,而submit下的颜色仍然为蓝色。目前我也找不到submit这个成员变量名叫什么。不知道各位有什么好的办法。

2.默认展开searchView:

很多人都有这个需求,想默认吧searchView展开,再加点默认文字在上面(不是hint).

这个使用这个展开:

MenuItem searchItem = menu.findItem(R.id.menu_search);
		searchItem.expandActionView();

这样设置文字:

searchView.setQuery("ok", false);

如果仅仅这样会吧虚拟键盘也打开,影响体验,关闭虚拟键盘的方法是使searView清除焦点:

searchView.clearFocus();

参考:

谷歌开发文档:http://developer.android.com/training/search/setup.html

恺风的博客 http://blog.csdn.net/flowingflying/article/details/14163401

Android actionbar 搜索框,布布扣,bubuko.com

时间: 2024-12-26 15:53:15

Android actionbar 搜索框的相关文章

android浮动搜索框

android浮动搜索框的配置比较繁琐,需要配置好xml文件才能实现onSearchRequest()方法. 1.配置搜索的XML配置文件?,新建文件searchable.xml,保存在res/xml文件夹中. 1 <?xml version="1.0" encoding="UTF-8"?> 2 3 <searchable android:label="@string/search_label" 4 android:search

Android学习笔记_79_ Android 使用 搜索框

1.在资源文件夹下创建xml文件夹,并创建一个searchable.xml: <?xml version="1.0" encoding="utf-8"?> <searchable xmlns:android="http://schemas.android.com/apk/res/android" android:label="@string/sms_search" android:hint="@st

Android实现搜索框内自动完成文本框

Android实现搜索框内自动完成文本框 xml文件代码如下: 1 <?xml version="1.0" encoding="utf-8"?> 2 <LinearLayout 3 xmlns:android="http://schemas.android.com/apk/res/android" 4 android:orientation="vertical" 5 android:layout_width=

android浮动搜索框的使用

引言 在我们的应用程序中经常需要提供搜索服务,比如搜索联系人, 搜索商品信息等等.我们可以自己在布局中自定义我们的搜索框,实现我们的搜索逻辑.但是还有一种更简单的方法:使用android系统给我们提供的搜索功能框架. 在android中,提供两种实现搜索功能的方式:search dialog 和 searchView. search dialog类似于普通的dialog,悬浮于我们的窗体之上.示例图如下: searchView通常被嵌套在我们的布局之中,最典型的案例就是在actionBar中使用

Android自定义搜索框

搜索框里的虚拟键盘 xml如下 <EditText android:id="@+id/et_shopshow_search" android:layout_width="144dp" android:layout_height="40dp" android:singleLine="true" android:paddingLeft="8dp" android:paddingRight="8d

Xamarin Android 的搜索框 : Search Dialog

Android 的搜索有两种可用方式: Search Dialog它是一个 UI Component , 被激活的时候, 会在顶部显示一个浮动的搜索框. SearchView  可以被布局到任何地方.在 Android 3.0 (Level 11) 中提供. SearchView 简单,随意使用,这里主要说说 Search Dialog  的基本用法, 因为 Xamarin 的处理方式稍稍和 原生 Android 有些不同. 效果: 源码: https://github.com/gruan01/

Android的搜索框SearchView的用法-android学习之旅(三十九)

SearchView简介 SearchView是搜索框组件,他可以让用户搜索文字,然后显示.' 代码示例 这个示例加了衣蛾ListView用于为SearchView增加自动补全的功能. package peng.liu.test; import android.app.Activity; import android.graphics.Color; import android.graphics.drawable.Drawable; import android.os.Bundle; impor

Xamarin.Android 制作搜索框

前段时间仿QQ做了一个搜索框样式,个人认为还不错,留在这里给大家做个参考,希望能帮助到有需要的人. 首先上截图(图1:项目中的样式,图2:demo样式): 不多说直接上代码: Main.axml <?xml version="1.0" encoding="utf-8"?> <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" androi

Android ActionBar 使用详解

ActionBar取代了以前的TitleBar,是一种更加灵活的人机交互方式:ActionBar并不是完全自立门户的一个新兴的东西,而是和3.0以下版本的menu进行了合并整合:so,添加actionbar的方式肯定和添加menu方式类似: 1.常见普通ActionBar先来看一个menu的xml配置 <menu xmlns:android="http://schemas.android.com/apk/res/android" > <item android:id=