比如你可以以下的方式设置android:searchSuggestSelection:
示例2:
<?xml version="1.0" encoding="utf-8"?> <searchable xmlns:android="http://schemas.android.com/apk/res/android" android:label="@string/app_label" android:hint="@string/search_hint" android:searchSuggestAuthority="com.example.MyCustomSuggestionProvider"
android:searchSuggestIntentAction="android.intent.action.VIEW"
android:searchSuggestSelection="word MATCH ?">
</searchable>
通过这样的配置, 你的query()方法的selection参数将是"word MATCH ?"且selectionArgs参数就是search query. 当你把他们传到SQLite的query()方法后, 他们将进行合成(问号将被query text所代替。如果你采用该方式来进行suggestion的查询且需要在query text的基础上再使用通配符,那么请在selectionArgs上追加他们(and/or prefix),因为该值用quotes进行wrap,然后插入到“?”所在的位置.
示例2
的另外一个新属性是android:searchSuggestIntentAction, 它定义了当用户选择一个suggestion后,发送的intent的action值我们将在下文对它进行更深入的讨论。
Tip
:如果你不想在
android:searchSuggestSelection
中定义selection clause,但是你还是想通过
selectionArgs
参数接收query text, 那么只需要把
android:searchSuggestSelection
设置为非空就可以了。这样query text还是会被传到
selectionArgs
,你忽略selection参数就行了.通过这种方式你可以在更底层定义selection clause(这里的更底层是哪里呢?puzzle)这样你的content provider就根本不需要处理它了。
Building a suggestion table
当你通过Cursor向系统返回suggestion列表时,系统希望该Cursor中包含了一些specific的列。 所以无论你的suggestion data是以SQLite database的形式存储在设备上或以SQLite database的形式存储在web服务器上, 还是以其他的格式存储在你设备或web上,你都必须把suggestions格式为table中的rows,且以Cursor的形式来提供suggestion. 系统能够understands几个columns, 其中有2个是必须要提供的: _ID
每个suggestion的unique integer row ID. 系统需要它,以便在ListView中显示suggestions.
SUGGEST_COLUMN_TEXT_1
主suggestion text
下面的几列是可选:
SUGGEST_COLUMN_TEXT_2
次suggestion text。如果你的Cursor包含了该列,那么suggestion将以2行的形式进行显示。次
suggestion text将在首
suggestion text下面一行以更小的字体进行显示。如果该列的值为空或null,则表示没有次
suggestion text。
SUGGEST_COLUMN_ICON_1
它表示的是一个drawable resource, content或file的URI字符串形式. 如果你的Cursor包含了该column, 那么所有的suggestions将以文本+图标的形式进行显示,该图标在文本的左边. 该值可以为null或zero以表示该行所对应的suggestion没icon.
SUGGEST_COLUMN_ICON_2
它表示的是一个drawable resource, content或file的URI字符串形式. 如果你的Cursor包含了该column, 那么所有的suggestions将以文本+图标的形式进行显示,该图标在文本的右边. 该值可以为null或zero以表示该行所对应的suggestion没icon.
SUGGEST_COLUMN_INTENT_ACTION
它是一个intent action的字符串形式. 它用于定义当用户选择了suggestion时的intent的action。 如果该列没有被提供, 则次时intent的action为searchable配置文件中
android:searchSuggestIntentAction
属性的值. 如果你的所有的suggestions的action都一样, 那么最好使用
android:searchSuggestIntentAction
来定的该intent的action,而不用该列。
SUGGEST_COLUMN_INTENT_DATA
它表示的是一个data的URI字符串形式。它用于定义当用户选择了suggestion时的intent的data。 如果该列没有被提供, 则次时intent的action为searchable配置文件中
android:searchSuggestIntentData
属性的值. 如果你的所有的suggestions的intent的data都一样, 那么最好使用
android:searchSuggestIntentData
来定义该intent的data,而不用该列。
SUGGEST_COLUMN_INTENT_DATA_ID
它是URI字符串形式. 如果该列被提供,"/"+该列的值将被追加到intent的data域上.只有searchable配置文件的android:searchSuggestIntentData属性被设置了(这时该属性做为data的基本URL字符串),该列才有意义.
SUGGEST_COLUMN_INTENT_EXTRA_DATA
它可以是任意的数据. 如果提供了该列的值,它会被加入到当用户选择了suggestion时的intent的extra data。如果没有提供,那么intent的extra data域就是null.该列让suggestions可以提供额外的data,以便在intent的extras中通过
EXTRA_DATA_KEY
key进行提取。
SUGGEST_COLUMN_QUERY
它表示该suggestion所对应的query(查询关键字). 如果提供了该列的值,它会被加入到当用户选择了suggestion时的intent的
extra data。可以在intent的extras中通过
QUERY
key进行提取,如果suggestion的action是
ACTION_SEARCH
,这该列为必选。否则,为可选的
SUGGEST_COLUMN_SHORTCUT_ID
该列只有为Quick Search Box提供suggestions才有用.该列说明了search suggestion是否会被做为a shortcut而被保存以及它是否是validated. 当用户在Quick Search Box中点击一个suggestion,那么针对该suggestion的Shortcuts通常会被生成并被存储.如果没该列,则suggestion的Shortcuts会被存储,但是永远不会被刷新。如果把它设置为
SUGGEST_NEVER_MAKE_SHORTCUT
,
那么就不会有Shortcuts,否则该shortcut Id是在使用
SUGGEST_URI_PATH_SHORTCUT
进行最新suggestion检查时使用。
SUGGEST_COLUMN_SPINNER_WHILE_REFRESHING
该列只有为Quick Search Box提供suggestions才有用。在Quick Search Box中,当系统在进行
Quick Search Box
的更新时,该列所表示的图标将取代
SUGGEST_COLUMN_ICON_2
在其位置进行显示。
关于上面几列的详细信息,后文还会继续介绍。