2011年2月23日水曜日

検索ボックスを設置する

EditTextに入力したキーワードで検索を行う、いわゆる検索ボックスを作成する方法。



1. Google検索

おそらく一番シンプルな形がこれ。

public void search() {
 String textUrl ="http://www.google.co.jp/m/search?hl=ja&q=";
 textUrl += ((EditText)findViewById(R.id.SearchField)).getText().toString();
 Intent intent = new Intent(Intent.ACTION_VIEW, Uri.parse(textUrl)); 
 startActivity( intent );
}

EditTextのidはSearchFieldという設定である。
検索ボタンを押したら上のコードを実行するようにすればいい。(2.以下でも同じ。)

http://www.google.co.jp/search だとPC用のレイアウトで表示されて、
http://www.google.co.jp/m/search だとスマートフォン用のレイアウトで表示されるっぽい。

端末の「常にこの操作で使用する」と設定されたブラウザで開く。(設定されていない場合はブラウザを選択して開く。)

検索用のURLを文字列で作成し、ブラウザに渡すだけのコードで、以下はこれの応用になる。

2.サイト内検索/複数サイト内検索
public void sitesearch() {
 String textUrl ="http://www.google.co.jp/m/search?hl=ja&q=";
 textUrl += ((EditText)findViewById(R.id.SearchField)).getText().toString() +" ";
 textUrl += "site:" + "http://XXX.com/"
 Intent intent = new Intent(Intent.ACTION_VIEW, Uri.parse(textUrl)); 
 startActivity( intent );
}

一行追加しただけ。
http://XXX.com/ のところを対象のURLにする。
site:http://XXX.com/ を入れればサイト内検索ができるというGoogle検索の設定を使用しただけで、ロジックとしては1.と特に変わらない。

複数サイトのサイト内検索を行う場合は
public void multisitesearch() {
 String textUrl ="http://www.google.co.jp/m/search?hl=ja&q=";
 textUrl += ((EditText)findViewById(R.id.SearchField)).getText().toString() +" ";
 textUrl += "site:" + "http://XXX.com/" + " OR ";
 textUrl += "site:" + "http://YYY.com/;
 Intent intent = new Intent(Intent.ACTION_VIEW, Uri.parse(textUrl)); 
 startActivity( intent );
}

これも、サイト内検索をORでつなぐというだけで本質的には何も変わらないが、これで複数サイト内を検索できるということ自体があまり知られていないのではないかと思ったので、載せておく。
上では特定の2サイトのみを対象にしているが、3つ以上でも同様にできる。ユーザーが検索の度に対象サイトのリストを選べる、とかもこの応用で。

欠点は、表示した検索結果の検索ボックスがごちゃごちゃしてしまって格好悪い点と、検索キーワードの最後に OR を入力されたりすると上手く機能しない点。

3. Google以外の検索サービスを使用する場合
Google以外の検索サービスを使用する場合も、URLで明示的に検索結果が作れる場合は基本的に同じでいいが、一部では検索ワードをSHIFT_JISなどUNICODE以外の文字コードで入力しないと検索できない場合がある。
詳しくないので汎用性がどれだけあるか分からないが、少なくともいくつかのBlog内検索ではこの方法で解決できた。

public void sitesearch() {
 String textUrl ="http://XXX/search/?keyword=";
 try {
  byte[] tmpbytes =((EditText)findViewById(R.id.SearchField)).getText().toString().getBytes("SJIS");
  
  for(int i=0;i<tmpbytes.length;i++){
   textUrl += "%"+Integer.toString(tmpbytes[i]& 0xFF, 16);
  }

 } catch (UnsupportedEncodingException e) {
 }

 Intent intent = new Intent(Intent.ACTION_VIEW, Uri.parse(textUrl)); 
 startActivity( intent );
}

検索キーワードを文字コードに変換している以外は、1.と変わらない。

4. ENTERキーの入力で検索を実行する
検索ボタンを押さなくても、検索ボックス内でENTERを押せば検索を実行出来るという設定。
私的ログ~Android開発編: EditTextでソフトキーボードのイベントをハンドリングする  http://android-vl0c0lv.blogspot.com/2009/08/edittext.html
に書いてある通りだが、以下でできた。
リンク先のコードだとDELキーも効かなくなってしまい、入力した文字が消せないので、少し修正した。
また、search()とした部分はこのように別のメソッドにしておくと、検索ボタンの処理と共用できる。

final EditText SearchField =(EditText) findViewById(R.id.SearchField);
SearchField.setOnKeyListener(new View.OnKeyListener(){
 public boolean onKey(View v, int keyCode, KeyEvent event) {

  if (event.getAction() == KeyEvent.ACTION_DOWN && keyCode == KeyEvent.KEYCODE_ENTER) {
   return true;
  }

  if (event.getAction() == KeyEvent.ACTION_UP && keyCode == KeyEvent.KEYCODE_ENTER) {
   if (SearchField != null && SearchField.length() != 0) {
    search();
   }
   return true;
  }
 return false;
 }
});

0 件のコメント:

コメントを投稿