前回の記事Action Barに検索Viewを設けるでは、入力欄を設けただけだった。ここで作業を終わってしまうのであれば、単なる、マニアである。SearchManagerはSuggestionsを利用してこそ有益になる。
Adding Recent Query Suggestionsに書かれているとおり下記のとおりサンプルプログラムを作ってみた。この記事で実現されるのは、利用者が過去に入力した文字列をそのまま候補として掲示することである。
public class MainActivity extends Activity{
private final String TAG = "MainActivity";
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
}
@Override
public boolean onCreateOptionsMenu(Menu menu){
getMenuInflater().inflate(R.menu.main, menu);
SearchView sV;
SearchManager sM = (SearchManager)getSystemService(Context.SEARCH_SERVICE);
ComponentName c = getComponentName();
SearchableInfo si = sM.getSearchableInfo(c);
MenuItem mi = menu.findItem(R.id.action_Search);
sV = (SearchView)mi.getActionView();
sV.setSearchableInfo(si);
sV.setIconifiedByDefault(false);
/*
* setSubmitButtonEnabled()について
* trueは、送信ボタンが右端に表示される。
* falseは、表示されない。
*/
sV.setSubmitButtonEnabled(true);
/*
* setMaxWidth()について
* これを設定しない場合、幅が狭い。このため設定した方が良い。
* 引数には、物理画面の横幅の大きさを超える値を設定しても問題は無い。
* 超えた値であっても、送信ボタンやアイコンは表示される。タイトル文字列は見えない。
*/
DisplayMetrics metrics = new DisplayMetrics();
getWindowManager().getDefaultDisplay().getMetrics(metrics);
sV.setMaxWidth(metrics.widthPixels);
// setTitle("");これは不要です。
return true;
}
@Override
protected void onNewIntent(Intent intent){
setIntent(intent);
if(Intent.ACTION_SEARCH.equals(intent.getAction())==true){
String q = intent.getStringExtra(SearchManager.QUERY);
SearchRecentSuggestions srs;
srs = new SearchRecentSuggestions(this,
MySuggestionProvider.AUTHORITY,
MySuggestionProvider.MODE
);
srs.saveRecentQuery(q, null);
Log.d(TAG, "onNewIntent() : query==" + q);
}
}
}
MySuggestionProvider.java
public class MySuggestionProvider extends SearchRecentSuggestionsProvider {
public final static String AUTHORITY = "com.example.searchable.MySuggestionProvider";
public final static int MODE = DATABASE_MODE_QUERIES;
public MySuggestionProvider() {
setupSuggestions(AUTHORITY, MODE);
}
}
AndroidManifest.xml
<?xml version="1.0" encoding="utf-8"?>
<manifest
xmlns:android="http://schemas.android.com/apk/res/android"
package="com.example.searchable"
android:versionCode="1"
android:versionName="1.0"
>
<uses-sdk
android:minSdkVersion="8"
android:targetSdkVersion="17"
>
</uses-sdk>
<application
android:allowBackup="true"
android:icon="@drawable/ic_launcher"
android:label="@string/app_name"
android:theme="@style/AppTheme"
>
<activity
android:name=".MainActivity"
android:launchMode="singleTop"
>
<intent-filter>
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.LAUNCHER" />
</intent-filter>
<intent-filter>
<action android:name="android.intent.action.SEARCH" />
</intent-filter>
<meta-data
android:name="android.app.searchable"
android:resource="@xml/searchable"
/>
</activity>
<provider
android:name=".MySuggestionProvider"
android:authorities="com.example.searchable.MySuggestionProvider"
>
</provider>
</application>
</manifest>
res/xml/searchable.xml
<?xml version="1.0" encoding="utf-8"?>
<searchable
xmlns:android="http://schemas.android.com/apk/res/android"
android:label="@string/app_name"
android:hint="@string/SearchHint"
android:searchSuggestAuthority="com.example.searchable.MySuggestionProvider"
android:searchSuggestSelection=" ?"
>
</searchable>