搜索框

搜索框

  1. 在res-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="@string/sms_search" 
        android:searchSuggestAuthority="com.charon.MyProvider"//自定义的Provider
        android:searchSuggestSelection=" ?" >
    </searchable>
  2. 创建一个搜索的Activity,并且在清单文件中进行配置,这个Activity就是点击搜索结果后的页面(显示搜索结果的Activity)

    <activity android:name=".SearchableActivity" >
            <intent-filter>
                <action android:name="android.intent.action.SEARCH" />
            </intent-filter>
            <meta-data
                android:name="android.app.searchable"
                android:resource="@xml/searchable" />
        </activity>

    在这个Activity中的内容要这样

    Intent intent = getIntent();
    //如果是从搜索开启的这个页面就获取到搜索框中输入的内容
    if (Intent.ACTION_SEARCH.equals(intent.getAction())) {  
        //获取到在搜索框中输入的内容      
        String query = intent.getStringExtra(SearchManager.QUERY);    
        //执行搜索的方法 
        doMySearch(query);   
        Log.i("i", " query " + query);
    }
  3. 如何实现在输入框中输入内容后下面就立马提示相应的搜索结果呢?要通过Provider来操作

    public class MyProvider extends SearchRecentSuggestionsProvider {
        //指定查询的authority
        public final static String AUTHORITY = "com.charon.MyProvider";
        //指定数据库的操作是查询的方式
        public final static int MODE = DATABASE_MODE_QUERIES; 
        public MySuggestionProvider() {
            setupSuggestions(AUTHORITY, MODE);
        }
    
        //然后重写SearchRecentSuggestionsProvider中的方法,有增删改查四个方法
        private final static String[] sms_projection = new String[]{Sms._ID,Sms.ADDRESS,Sms.BODY};
    
        private final static String[] columnNames = new String[]{BaseColumns._ID,
            SearchManager.SUGGEST_COLUMN_TEXT_1,   //指定搜索自动提示的框的样式
            SearchManager.SUGGEST_COLUMN_TEXT_2,
            SearchManager.SUGGEST_COLUMN_QUERY};    //这个参数能够让点击某个搜索提示的时候自动让搜索内容变成点击的条目的内容
    
        @Override
        public Cursor query(Uri uri, String[] projection, String selection,
                String[] selectionArgs, String sortOrder) {
            if(selectionArgs != null){
                String query = selectionArgs[0]; 
                if(TextUtils.isEmpty(query)){
                    return null;
                }
    
                Uri uri1 = Sms.CONTENT_URI;
                String where = Sms.BODY + " like '%" + query + "%'";
                Cursor cursor = getContext().getContentResolver().query(uri1, sms_projection, where, null, Sms.DATE + " desc ");
                return changeCursor(cursor);
            }
            return null;
        }
    
        private Cursor changeCursor(Cursor cursor){
            MatrixCursor result = new MatrixCursor(columnNames);
            if(cursor != null){
                while(cursor.moveToNext()){
                    Object[] columnValues = new Object[]{cursor.getString(cursor.getColumnIndex(Sms._ID)),
                            cursor.getString(cursor.getColumnIndex(Sms.ADDRESS)),
                            cursor.getString(cursor.getColumnIndex(Sms.BODY)),
                            cursor.getString(cursor.getColumnIndex(Sms.BODY))};  //点击时候让内容变为短信内容
                    result.addRow(columnValues);
                }
            }
            return result;
        }
    }
  4. 为了让不管在哪个界面只要点击手机的搜索键都能够弹出我们的搜索(全局搜索),需要在Application节点中去配置下面的meta-data

    <!-- 指定我们要激活的是哪个SearchableActivity -->
    <meta-data
        android:name="android.app.default_searchable"
        android:value=".SearchableActivity" />
  5. 在Activtity中有一个onSearchRequested方法,执行此方法时能够激活搜索框,所以在点击搜索按钮时执行此方法即可


  • 邮箱 :charon.chui@gmail.com
  • Good Luck!
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值