嗯,我想要的是:
我的实际代码如下:
(我已导入android.support.v7.widget.SearchView
而不是android.widget.SearchView
。当我使用android.widget.SearchView
时,此功能正常,但其他事情并非如此
private MenuItem searchIteam, searchSettings;
private SearchView searchView;
@Override
public boolean onCreateOptionsMenu(final Menu menu) {
MenuInflater inflater = getMenuInflater();
inflater.inflate(R.menu.menu_main, menuMain);
searchItem = menu.findItem(R.id.search);
searchSettings = menu.findItem(R.id.action_searchSettings);
searchView = (SearchView)MenuItemCompat.getActionView(item);
searchSettings.setVisible(false); // hide searchSettings Item when Menu is created
searchView.setOnQueryTextListener(new SearchView.OnQueryTextListener() {
@Override
public boolean onQueryTextSubmit(String query) {
return false;
}
@Override
public boolean onQueryTextChange(String newText) {
(...)
return false;
}
});
// Detect SearchView icon clicks
searchView.setOnSearchClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
setItemsVisibility(menuMain, item, false);
searchSettings.setVisible(true);
}
});
// Detect SearchView close
searchView.setOnCloseListener(new SearchView.OnCloseListener() {
@Override
public boolean onClose() {
supportInvalidateOptionsMenu(); //shouldn't this reload the Action Bar as it was when onCreate?
return true;
}
});
return super.onCreateOptionsMenu(menu);
}
private void setItemsVisibility(Menu menu, MenuItem exception, boolean visible) {
for (int i=0; i<menu.size(); ++i) {
MenuItem item = menu.getItem(i);
if (item != exception) item.setVisible(visible);
}
}
@Override
public boolean onOptionsItemSelected(MenuItem item) {
int id = item.getItemId();
if (id == android.R.id.home) {
onBackPressed();
}
return super.onOptionsItemSelected(item);
}
@Override
public void onBackPressed() {
supportInvalidadeOptionsMenu();
super.onBackPressed();
}
当我按下&#34;返回&#34;此代码不起作用。第一次,它只关闭搜索的EditText,图标不会改变。如果我再次按下,活动会升级,但我可以看到图标作为开始(在我按下&#34;第一次回来&#34;第一次)之前得到它们在活动结束前一会儿...
---编辑---
目前,如果我点击Search ActionBar Icon,然后开始按&#34; Back Button&#34;反复发生以下情况:
然后,出于测试目的,我这样做了:
boolean pressed1, pressed2, pressed3;
searchView.setOnSearchClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
pressed1 = false;
pressed2 = false;
pressed3 = false;
setItemsVisibility(menuMain, item, false);
searchSettings.setVisible(true);
}
});
@Override
public void onBackPressed() {
if (!pressed1) {
pressed1 = true;
}
else if(!pressed2) {
pressed2 = true;
}
else if(!pressed3) {
pressed3 = true;
supportInvalidateOptionsMenu();
}
else {
super.onBackPressed();
}
}
现在,会发生什么:
---编辑2 ---
然后我改变了这个:
@Override
public void onBackPressed() {
if (!pressed1) {
pressed1 = true;
onBackPressed();
}
else if(!pressed2){
pressed2 = true;
onBackPressed();
}
else if(!pressed3){
pressed3 = true;
supportInvalidateOptionsMenu();
}
else {
super.onBackPressed();
}
}
现在发生的事情是:
---编辑3 ---(解决方案)---
我想方法setOnSearchClickListener
和setOnCloseListener
来自android.widget.SearchView
...我已经导入了android.support.v7.widget.SearchView
,我已经改变了它们到:
MenuItemCompat.setOnActionExpandListener(searchItem,
new MenuItemCompat.OnActionExpandListener() {
@Override
public boolean onMenuItemActionExpand(MenuItem menuItem) {
setItemsVisibility(menu, searchItem, false);
return true;
}
@Override
public boolean onMenuItemActionCollapse(MenuItem menuItem) {
supportInvalidateOptionsMenu();
return true;
}
});
现在工作得很好(:
答案 0 :(得分:0)
我希望我能帮到你:第一次按BACK键时,键盘会被隐藏。第二次按BACK,应用程序退出。
如果是这种情况,那么一切正常。因为这是super.onBackPressed()应该做的。如果显示键盘,它会尝试隐藏键盘。如果没有,它将尝试前一个活动。如果没有,它将退出应用程序。
所以你需要做的是使用onBackPressed()方法。基本上,如果你确定应该做什么,你不一定需要调用超级方法。
@Override
public void onBackPressed() {
if ( isSearching) {
supportInvalidadeOptionsMenu();
isSearching = false;
} else {
super.onBackPressed();
}
}
所以现在,当你从不按BACK按钮时,活动将检查是否正在搜索,并决定重新渲染操作栏或照常执行其正常操作。
您需要添加一些逻辑来设置布尔标志isSearching,例如,单击搜索时将isSearching设置为true。
我不确定supportInvalidadeOptionsMenu()是否会重置您的操作栏。无论如何,您可以改为调整每个视图的可见性。