zoukankan      html  css  js  c++  java
  • 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.怎样改变默认搜索框底下的那条横线的颜色,这个看似easy,事实上非常麻烦,假设直接设置背景图片的话,非常可能会造成叠加的情况。网上看了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

  • 相关阅读:
    CSS :hover伪类选择定义和用法
    php disk_free_space与disk_total_space实例介绍
    css required,focus,valid和invalid介绍
    E:in-range伪类选择器与E:out-of-range伪类选择器
    php不使用copy()函数复制文件的方法
    数组金额 转 大写
    PHP GD压缩图片
    php快递查询API类-支持各种快递
    share一段采集程序的代码
    全自动小说订阅微信推送
  • 原文地址:https://www.cnblogs.com/blfshiye/p/4330347.html
Copyright © 2011-2022 走看看