facebook twitter hatena line email

Android/検索ボックス

提供: 初心者エンジニアの簡易メモ
移動: 案内検索

検索追加サンプル

  • ManifestAndroid.xml
<activity android:name=".MainActivity"
           android:label="@string/app_name">
    <intent-filter>
             <action android:name="android.intent.action.MAIN" />
             <category android:name="android.intent.category.LAUNCHER" />
    </intent-filter>
    <meta-data android:name="android.app.default_searchable"
                android:value=".SearchActivity"/>
</activity>
<activity android:name=".SearchActivity">
    <intent-filter>
        <action android:name="android.intent.action.SEARCH" />
        <category android:name="android.intent.category.DEFAULT" />
    </intent-filter>
    <meta-data android:name="android.app.searchable"
          android:resource="@xml/searchable" />
</activity>
  • MainActivity.java // 検索を開く
// 簡易版
onSearchRequested();
// SearchManager指定版
String initialQuery="あいうえお";
Bundle appSearchData = new Bundle();
SearchManager searchManager = (SearchManager) getSystemService(Context.SEARCH_SERVICE);
boolean globalSearch = false;//true:google,false:local
searchManager.startSearch(initialQuery, false, getComponentName(), appSearchData, globalSearch);
  • xml/searchable.xml
<?xml version="1.0" encoding="utf-8"?>
<searchable xmlns:android="http://schemas.android.com/apk/res/android"
       android:label="@string/search_label"
       android:searchSettingsDescription="@string/settings_description"
       android:includeInGlobalSearch="true"
       android:searchSuggestAuthority="dictionary"
       android:searchSuggestIntentAction="android.intent.action.VIEW">
</searchable>

注意:android:labelとandroid:searchSettingsDescriptionは必ず@stringからロードすること、固定で文字列を入れると起動しなくなる。

  • SearchActivity.java
// 検索結果
public class SearchActivity extends Activity {
   @Override
   protected void onCreate(Bundle savedInstanceState) {
       super.onCreate(savedInstanceState);
       setContentView(R.layout.search_result);
       Intent intent = getIntent();
       if (Intent.ACTION_SEARCH.equals(intent.getAction())) {
         String query = intent.getStringExtra(SearchManager.QUERY);
         Log.d("hoge", query); // 検索文字列取得
       }
   }
}
  • res/layout/search_result.xml
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
       android:id="@+id/search_layout"
   android:orientation="vertical"
   android:layout_width="match_parent"
   android:layout_height="match_parent"
   >
   <ListView android:id="@+id/android:list" 
             android:layout_height="wrap_content" 
             android:layout_width="match_parent" android:scrollingCache="false" android:dividerHeight="1px" android:layout_gravity="top|left" android:layout_weight="90">
   </ListView>
   <TextView android:id="@+id/android:empty" 
             android:layout_width="wrap_content" 
             android:layout_height="wrap_content"
             android:textSize="20sp" android:text="msg_no_search_result">
   </TextView>
</LinearLayout>

検索欄をあらかじめviewに表示させておきたい場合。

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
       android:layout_alignParentTop="true"
       android:layout_width="match_parent"
       android:layout_height="45dip"
       android:background="@drawable/bg_head"
       android:gravity="center_vertical"
       android:orientation="horizontal"
       android:paddingLeft="5dip"
       android:paddingRight="5dip" >
       >
   <ImageView
       android:id="@+id/searchbar_icon"
       android:layout_width="35dip"
       android:layout_height="35dip"
       android:layout_marginRight="5dip"
       android:gravity="center_vertical"
       android:src="@drawable/ic_launcher" />
   <EditText
       android:id="@+id/searchbar_edittext"
       style="@android:attr/editTextStyle"
       android:layout_width="0dip"
       android:layout_height="match_parent"
       android:layout_gravity="center_vertical"
       android:layout_marginTop="3dip"
       android:layout_weight="1"
       android:drawableRight="@android:drawable/ic_search"
       android:ellipsize="end"
       android:focusable="false"
       android:gravity="center_vertical"
       android:hint="search..."
       android:singleLine="true" />
</LinearLayout>
  • 画像
res/drawable/ic_search.png
res/drawable/bg_head.png

同じ画面で検索する

android:launchMode="singleTop"をつける

  • AndroidManifest.xml
<activity
    android:name=".MainActivity"
    android:label="@string/app_name"
    android:launchMode="singleTop"
 >
   <intent-filter>
     <action android:name="android.intent.action.SEARCH" />
   </intent-filter>
   <meta-data android:name="android.app.default_searchable"
    android:value=".MainActivity"/>
   <meta-data android:name="android.app.searchable"
    android:resource="@xml/searchable" />
</activity>
  • MainActivity.java
   @Override
   protected void onNewIntent(Intent intent) {
     if (Intent.ACTION_SEARCH.equals(intent.getAction())) {
       String query = intent.getStringExtra(SearchManager.QUERY);
       //Toast.makeText(this, query, Toast.LENGTH_LONG).show();
     }
   }

参考

http://developer.android.com/guide/topics/search/search-dialog.html