スポンサーサイト

上記の広告は1ヶ月以上更新のないブログに表示されています。
新しい記事を書く事で広告が消せます。

(蛇足)QuickSearchBox対応の仕方

QuickSearchBox対応の仕方というエントリがおかげさまで大好評※を博しましたので、最後に補足というか蛇足を。
※個人の感想であり、統計的な正しさをもった好評を確約するものではありません
※ちょっとContentProvider実装に余計なところが多かったのでバッサリと削除してよりシンプルに修正しました。そのでついでに。


最終的にじゃぁ検索のActivityはどうなるのさ?という点です。


もはやここまでくると何をしたいか?次第なので蛇足も蛇足なんですけどね。
まぁ一晩でもおけばクリアになるんだろうけど、QuickSearchBox対応が終わった!みたいなテンションだとちょっとそのあたりもぼやけている可能性もありますので、ある程度ぼかしてポイントだけ。
復習もかねて、じゃぁユースケース的に考えましょう。


1)Suggestによる検索候補の表示
2)検索ボタンが押された場合の、検索の処理と、その結果表示
3)検索結果の表示からそのアイテムが選択した場合の挙動
4)Suggetの一覧からのアイテムの選択された場合の挙動
5)検索結果の表示からそのアイテムが長押しされた場合の挙動


1)はしつこいようですが、Activityが関与しませんが、
検索のロジック自体は、Suggestと同等にできることが多いはずですので、2)と共有できます。
3)と4)については、検索した結果から選択というので一緒です。何から選択するのか?について、
Suggestとして表示された一覧からなのか、Listなどに自分で表示した一覧からなのかの違いだけ。
5)に関してはここでは忘れます。


となると、結局は2つ。
検索と、選択です。

検索に関してはContentProviderをSuggest専用にするのはもったいないので、
Activityからの検索でも利用しましょう。

選択に関しては、処理に必要なデータをIntentから受け取るのか、Listの行や位置なんかから受け取るのか?の違いだけです。


散々ContentProviderはQuickSearchBoxの検索には(仕組みとしては)関係ないとしてきましたが、
まぁ検索処理の実態としては普通に使ってもいいですよね。ということでここでようやくつながる。といった感じです。


以下使ったことはないけど簡易的な記載の為のListActivity前提

protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
Intent intent = getIntent();
String intentAction = intent.getAction();
if (Intent.ACTION_SEARCH.equals(intentAction)) {
String query = intent.getStringExtra(SearchManager.QUERY);
/*
* 検索ワードを受け取っての検索なので、Suggestと同じでよい。
* つまりは、ContentProviderに対して、同様のqueryを投げてやる。
* queryの投げ方はsearchable.xmlのsuggest関連指定と同様。
* 例では、selectionArgsにクエリ文字列を渡す形。
* 以下適当にmanageQueryでのイメージ
*
* (注)
* もちろん、Suggest時には不要なものもListには持たせたいなんてケースは別のクエリとしてもいいです。
* たとえば、Listの場合はClickだけではなくLongClickにも対応させたいので追加の情報を入れたいとか。
* (それで、Suggestの場合には不要なのでどうしても持たせたくないとか)
* その場合はそもそもUriMatcherなどを駆使してUriごとに検索を分けるような仕組みを実装する必要があります。
*/
Cursor managedQuery = managedQuery(SuggestProvider.CONTENT_URI, null, null, new String[]{query}, null);
setListAdapter(カーソル利用したアダプタ);
} else if(Intent.ACTION_VIEW.equals(intentAction)) {
/*
* Suggestから選択されたという事なので結果どうしたいのか?
* 普通に考えれば、Suggest関係なく検索した結果を表示して、そのItemが選択された場合はどうしたい?というのと一緒。
*/
itemSelected("付随情報 from data");
}
}

@Override
protected void onListItemClick(ListView l, View v, int position, long id) {
super.onListItemClick(l, v, position, id);
itemSelected("付随情報 from 行に保存したデータ、もしくはidなんかから取得");
}



最後に本当に蛇足。
Activityからの検索なんかは時間がかかるようでしたら非同期による実行をお忘れなく。
関連記事

コメントの投稿

非公開コメント

関係ない記事に失礼します。
はてなダイアリーの方の「mokkouyouの日記」に、コメントの書き込みフォームがなくてコメントができないんですが、もうコメントは受け付けていないのでしょうか……?

Re: タイトルなし

受け付けてないです。

青い空は専用サイトへ。
他はそもそもあまりなかったので。
必要であればどこでもかまいませんが。

ただ、マーケットとかで有料版以外にメルアドとか表示していないのは
基本サポートしないよというアピールなんですけどね。
ついついコメントされると対応しちゃうのですけども。

承認待ちコメント

このコメントは管理者の承認待ちです
スポンサードリンク
アプリ一覧
最新記事
最新コメント
最新トラックバック
検索フォーム
月別アーカイブ
カテゴリ
RSSリンクの表示
リンク
QRコード
QR
上記広告は1ヶ月以上更新のないブログに表示されています。新しい記事を書くことで広告を消せます。