使用此代码(取自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将消失。 我想拦截这个事件(不,onOptionsItemSelected()这次不会触发)并显示之前的布局,除了隐藏EditText。
注意:我需要API8(Android 2.2)兼容性!
谢谢!
答案 0 :(得分:2)
使用 ActionView 时,点击“向上”或“向后”不会导致祖先导航(可由 onOptionsItemSelected处理 em>)但会导致可折叠操作事件。
在Android开发者身上找到here。
处理可折叠的操作视图
如果您需要根据自己的可见度更新活动 动作视图,你可以在扩展时收到回调 通过定义OnActionExpandListener并注册它来折叠 使用setOnActionExpandListener()。例如:
@Override
public boolean onCreateOptionsMenu(Menu menu) {
getMenuInflater().inflate(R.menu.options, menu);
MenuItem menuItem = menu.findItem(R.id.actionItem);
...
menuItem.setOnActionExpandListener(new OnActionExpandListener() {
@Override
public boolean onMenuItemActionCollapse(MenuItem item) {
// Do something when collapsed
return true; // Return true to collapse action view
}
@Override
public boolean onMenuItemActionExpand(MenuItem item) {
// Do something when expanded
return true; // Return true to expand action view
}
});
}
所以,为了回答我的问题,我正在搜索onMenuItemActionCollapse事件。
PS:为了更好的一致性,我应该将案例searchId:从 onOptionsItemSelected 移到 onMenuItemActionExpand
答案 1 :(得分:0)
对于Home按钮,我可以假设您调用了
mActionBar.setHomeButtonEnabled(true);
在onCreate()中设置Sherlock Action Bar时?我相信当单击主页按钮时,为了获得具有项目ID android.R.id.home的onOptionsItemSelected()回调,这是必需的。
对于后退按钮,我认为你只需要在你的活动中覆盖onKeyDown:
@Override
public boolean onKeyDown(int keyCode, KeyEvent event) {
if (event.getKeyCode() == KeyEvent.KEYCODE_BACK) {
// Do something
return true;
}
return super.onKeyDown(keyCode, event);
}