全栈开发知识库

搜索框

  1. 在res-xml中新建一个searchable.xml
    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)
    xml <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中的内容要这样 java 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来操作 ```java 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 xml <!-- 指定我们要激活的是哪个SearchableActivity --> <meta-data android:name="android.app.default_searchable" android:value=".SearchableActivity" />

  5. 在Activtity中有一个onSearchRequested方法,执行此方法时能够激活搜索框,所以在点击搜索按钮时执行此方法即可


  • 邮箱 :charon.chui@gmail.com
  • Good Luck!