读书笔记,在Toolbar上的菜单项实现SearchView

来源:互联网 发布:绿盾加密软件 编辑:程序博客网 时间:2024/05/18 15:24

相比于直接在布局文件中添加SearchView控件,让SeachView以菜单项的形式体现出来比较复杂,具体步骤如下

  1. 在菜单布局文件中定义搜索项 
    最后一项属性非常重要
    <item        android:id="@+id/menu_search"        android:orderInCategory="1"        app:showAsAction="always"        android:title="@string/search_title"        app:actionViewClass="android.support.v7.widget.SearchView"        /> 
  2. 在res\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"            android:inputType="text"            android:searchButtonText="@string/search"    ></searchable>
    !!!注意:其中的标签和提示必须写字符串资源中的id,不能直接写字符串,如果直接写字符串,在后面可能会出现问题 实测
  3. 在AndroidManifest.xml文件中加入搜索结果activity节点定义,并指定action和meta-data
     <activity android:name=".NewsSearchAcitivity">            <intent-filter>            <action android:name="android.intent.action.SEARCH"/>            </intent-filter>            <meta-data android:name="android.app.searchable" android:resource="@xml/searchable"/>        </activity>
  4. 在搜索框所在的activity代码中初始化搜索框,并关联搜索动作对应的结果Activity
     private void initSearchView(Menu menu){        //获取menu中搜索item的单个实例        MenuItem menuItem = menu.findItem(R.id.menu_search);        //获取搜索item的View 并把它转为SearchView        SearchView searchView = (SearchView) MenuItemCompat.getActionView(menuItem);        //在布局文件中添加控件的获取方式        //SearchView searchView = (SearchView) findViewById(R.id.search_view);        if(searchView == null){            Log.d(TAG, "fail to get SearchView");        }else {            if(getIntent() != null){                //设置是否将搜索视图默认折叠为图标,当前不设置                searchView.setIconifiedByDefault(getIntent().getBooleanExtra("collapse",false));            }else {                searchView.setIconifiedByDefault(false);            }            //设置是否启用完成图标,当前设置            searchView.setSubmitButtonEnabled(true);            //得到搜索管理器实例            SearchManager manager = (SearchManager) getSystemService(SEARCH_SERVICE);            //可以根据组件启动搜索结果活动            ComponentName name = new ComponentName(this,NewsSearchAcitivity.class);            //检查搜索结果活动是否可到达            SearchableInfo info = manager.getSearchableInfo(name);            if(info == null){                Log.d(TAG, "fail to get result");            }            //设置搜索动作的定义            searchView.setSearchableInfo(info);            //系统id,不需要到布局文件中定义,当初不懂这个id走了很多弯路 private SearchView.SearchAutoComplete sac_key;            sac_key = searchView.findViewById(R.id.search_src_text);            sac_key.setTextColor(Color.BLACK);            sac_key.setHintTextColor(Color.BLACK);        }    }
  5. 调用以上方法
     @Override    public boolean onCreateOptionsMenu(Menu menu) {        getMenuInflater().inflate(R.menu.tab_first_menu,menu);        initSearchView(menu);//再次调用方法        return true;    }

  6. 搜索结果的获取
            Intent intent = getIntent();        if(intent != null && intent.getAction().equals(Intent.ACTION_SEARCH)){            String ori_kw = intent.getStringExtra(SearchManager.QUERY);


原创粉丝点击