検索を行うViewは、EditTextとButtonを併記すれば自作できる。これは簡単だ。
しかし、Androidシステムとして、検索に関する仕掛けが用意されているので、それを用いた方が、利用者の立場から見て親和性の高いViewを構築できる。
この記事は、検索用のViewだけを表示する仕掛けに関してだけである。検索するコマンドは実装していない。
私の所感
SearchView等を使わず、EditTextとButtonを用いて自作する方がずっと簡単だ!
にも関わらず、小難しいSearchViewを作っちゃったってことは、検索に関して
参考にしたサイト
Search Overview
Action Bar..."Action View"とは術語(専門用語)である。このAction Viewの具体例として、例えば、SearchViewがある。
Android Tutorial: Adding Search to Your Apps
簡単なサンプルプログラムを作ってみました。
Action Barに検索用文字列入力欄が表示され、そこに文字列を入力して実行すると、入力した文字列がログに表示されます。
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);
/*
* getActionView()について
* menuのxmlにおいて、android:actionViewClassで設定したactionViewを取得する。
* もし、android:actionViewClassが存在しない場合、getActionView()の戻値はnullである。
*/
sV = (SearchView)mi.getActionView();
sV.setSearchableInfo(si);
/*
* setIconifiedByDefault()について
* falseは、文字列入力領域が表示される。
* trueは、文字列入力領域は表示されずに、虫メガネアイコンだけが表示される。
*/
sV.setIconifiedByDefault(false);
return true;
}
@Override
protected void onNewIntent(Intent intent) {
/*
* getIntent()で得られるIntentは、原初の時点でのIntentのままである。
* setIntent()を使うことにより、最新のIntentに更新される。
*/
setIntent(intent);
if(Intent.ACTION_SEARCH.equals(intent.getAction())==true){
String q = intent.getStringExtra(SearchManager.QUERY);
Log.d(TAG, "onNewIntent() : query==" + q);
}
}
}
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="11"
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>
</application>
</manifest>
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"
>
</searchable>
menu/main.xml
<menu xmlns:android="http://schemas.android.com/apk/res/android" >
<item
android:id="@+id/action_Search"
android:actionViewClass="android.widget.SearchView"
android:showAsAction="always"
>
</item>
</menu>