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

本文介绍如何在Android应用中实现SearchView功能,包括定义搜索菜单项、设置搜索框样式及行为,以及如何处理搜索结果。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >


相比于直接在布局文件中添加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);


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值