通過此代碼(摘自ABS示例),我可以在我的ActionBar中添加一個「搜索」圖標,單擊時將顯示一個EditText(用於在列表中搜索) :在使用ActionBarSherlock在Android中搜索setActionView後返回使用ActionBarSherlock
@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中,App圖標獲得「後退」左箭頭。 如果用戶點擊「返回」按鈕或點擊ActionBar圖標(帶有向左箭頭),EditText消失。 我想截取這個事件(不,onOptionsItemSelected()這次不會觸發),並且除了隱藏EditText之外還顯示前面的佈局。
注:我需要API8(Android 2.2)兼容性!
謝謝!
不,我不叫'.setHomeButtonEnabled(真) '我的活動我不需要「主頁」按鈕,我只在搜索時才需要它(撤消搜索)。 由於'.setActionView(R.layout.collapsible_edittext)',我認爲它自己顯示。 – hybrid2102