このコード (ABS の例から取得) を使用すると、ActionBar に「検索」アイコンを追加できます。これは、クリックすると EditText を表示します (リストを検索するため)。
@Override
public boolean onCreateOptionsMenu(Menu menu) {
menu.add(Menu.NONE, searchId, Menu.NONE, R.string.menu_search)
.setIcon(android.R.drawable.ic_menu_search)
.setActionView(R.layout.collapsible_edittext)
.setShowAsAction(MenuItem.SHOW_AS_ACTION_ALWAYS | MenuItem.SHOW_AS_ACTION_COLLAPSE_ACTION_VIEW);
return true;
}
このコードを使用すると、「検索」アイコンをタップした後に別のレイアウトを表示できます。
@Override
public boolean onOptionsItemSelected(MenuItem item) {
switch (item.getItemId()) {
case searchId:
search = (EditText) item.getActionView();
search.addTextChangedListener(filterTextWatcher);
search.requestFocus();
InputMethodManager imm = (InputMethodManager) getSystemService(Context.INPUT_METHOD_SERVICE);
imm.toggleSoftInput(InputMethodManager.SHOW_FORCED, 0);
setContentView(R.layout.search);
this.allSongs = data.getSongs();
ListView list = (ListView) findViewById(R.id.songList);
list.setAdapter(new SongAdapter(this, this.allSongs));
}
return true;
}
このコードを使用すると、検索を処理できます。
private TextWatcher filterTextWatcher = new TextWatcher() {
public void afterTextChanged(Editable s) {
}
public void beforeTextChanged(CharSequence s, int start, int count, int after) {
}
public void onTextChanged(CharSequence s, int start, int before, int count) {
List<Song> results = new ArrayList<Song>();
Locale locale = Locale.getDefault();
for (Song song : allSongs) {
if (song.getTitle().toLowerCase(locale).contains(s.toString().toLowerCase(locale)))
results.add(song);
}
ListView list = (ListView) findViewById(R.id.songList);
list.setAdapter(new SongAdapter(ctx, results));
}
};
ユーザーが「検索」アイコンをタップすると、EditText が ActionBar に表示され、アプリ アイコンに「戻る」左矢印が表示されます。ユーザーが [戻る] ボタンをタップするか、ActionBar アイコン (左矢印付き) をタップすると、EditText が消えます。EditText を非表示にするだけでなく、このイベントをインターセプトして (いいえ、今回は onOptionsItemSelected() は起動しません)、以前のレイアウトを表示したいと思います。
注: API8 (Android 2.2) との互換性が必要です!
ありがとうございました!