如何使用搜索视图时操作栏的图标可见性



好吧,我想要的是:

  • 使用除"搜索设置"以外的所有项目初始化操作栏;
  • 单击"搜索
  • "图标时,将显示"搜索设置",其余图标将消失;
  • 当关闭搜索 EditText 时(按设备的后退按钮或操作栏的后退按钮),操作栏将返回到其原始状态(显示所有图标,除了"搜索设置")。

我的实际代码如下:

(我导入了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();
}

此代码不起作用,当我第一次按"返回"时,它只会关闭搜索的编辑文本,图标不会更改。如果我再次按回去,活动会上升一个级别,但我可以看到图标在活动关闭前一段时间开始(当我第一次按"返回"时应该得到它们应该得到的)......

---编辑---

目前,如果我单击搜索操作栏图标,然后开始反复按"后退按钮",则会发生以下情况:

  • 第一次按下:键盘隐藏,但搜索编辑文本仍处于打开状态;
  • 第二次按下:搜索结束(搜索 EditText 关闭并显示正常活动的内容);
  • 第三次按下:活动结束。

然后,出于测试目的,我这样做了:

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();
}
}

现在,发生的事情是:

  • 第一次按下:键盘隐藏,但搜索编辑文本仍处于打开状态;
  • 第二次按下:搜索结束(搜索 EditText 关闭并显示正常活动的内容);
  • 第三次按压:什么也没发生;
  • 第四次按压:什么也没发生;
  • 第 5 次按下:动作栏根据需要重新加载;
  • 第六次按压:活动结束;

--- 编辑 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();
}
}

现在正在发生的事情是:

  • 第一次按下:键盘隐藏,但搜索编辑文本仍处于打开状态;
  • 第二次按下:搜索结束(搜索 EditText 关闭并显示正常活动的内容);
  • 第三次按下:动作栏根据需要重新加载;
  • 第 4 次按下:活动结束;

--- 编辑 3 ---(解决方案)---

我猜setOnSearchClickListenersetOnCloseListener的方法来自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;
}
});

现在它工作得很好(:

我希望我猜对了:第一次按BACK时,键盘被隐藏了。第二次按"返回"时,应用将退出。

如果是这种情况,那么一切正常。这就是super.onBackPressed()应该做的。如果显示键盘,它将尝试隐藏键盘。如果没有,它将尝试进行上一个活动。如果没有,它将退出应用程序。

所以你需要做的是使用 onBackPressed() 方法。基本上,如果您确定应该做什么,则不一定需要调用 super 方法。

@Override
public void onBackPressed() {
if ( isSearching) {
supportInvalidadeOptionsMenu();
isSearching = false;     
} else {
super.onBackPressed();
}
}

所以现在,当你从不按"后退"按钮时,活动将检查是否正在搜索,并决定重新呈现操作栏或像往常一样执行正常操作。

您需要添加一些逻辑来设置布尔标志 isSearching,例如,在单击搜索时将 isSearch 设置为 true。

我不确定支持InvalidadeOptionsMenu()是否会重置您的操作栏。无论如何,您可以改为调整每个视图的可见性。

相关内容

  • 没有找到相关文章

最新更新