我的操作栏中有一个包含两个项目的菜单。打开搜索视图后,仍会显示“一支笔”。我怎么能隐藏它?
menu.xml文件:
<?xml version="1.0" encoding="utf-8"?>
<menu xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto">
<item
android:id="@+id/search"
android:title="@string/search"
android:icon="@drawable/ic_search"
app:actionViewClass="android.widget.SearchView"
app:showAsAction="ifRoom|withText" />
<item
android:id="@+id/edit"
android:icon="@drawable/ic_edit"
android:title="@string/edit"
app:showAsAction="ifRoom|withText" />
</menu>
我也试过了:
app:showAsAction="collapseActionView|ifRoom"
但在这种情况下,我有:
我希望得到第二张图片中显示的内容。但编辑图标应该隐藏或最终显示,但作为一个整体。
修改
基于@Ahmad Alsanie回答我写的是这样的:
SearchView view = (SearchView) menu.findItem(R.id.search).getActionView();
view.setOnQueryTextFocusChangeListener(new View.OnFocusChangeListener() {
@Override
public void onFocusChange(View v, boolean hasFocus) {
if (hasFocus)
menu.findItem(R.id.edit).setVisible(false);
});
它有效,但是如何在关闭搜索视图后恢复编辑图标?我尝试了setOnCloseListener
但未成功。
答案 0 :(得分:3)
首先在onCreateOptionsMenu
内使用此内容:
MenuInflater inflater = getSupportMenuInflater();
inflater.inflate(R.menu.edit, menu);
if (menu.getItem(1).isFocused()) //detect if search view has focus
{
//hide only option 2 which is in this case edit pen
menu.getItem(2).setVisible(false);
}else{
menu.getItem(2).setVisible(true);
}
然后使用:
invalidateOptionsMenu();//to call onCreateOptionMenu again
答案 1 :(得分:2)
@Ahmed Awad回答不错但是searchView.setOnCloseListener不起作用所以使用MenuItemCompat.setOnActionExpandListener
<强> menu_items.xml 强>
<?xml version="1.0" encoding="utf-8"?>
<menu xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto">
<item
android:id="@+id/action_search"
android:title="Search"
android:icon="@drawable/ic_action_search"
app:actionViewClass="android.support.v7.widget.SearchView"
app:showAsAction="always|collapseActionView"/>
<item
android:id="@+id/action_sort"
android:title="Sort"
android:icon="@drawable/ic_action_sort_alphabetically"
app:showAsAction="always"/>
</menu>
<强>活动强>
@Override
public boolean onCreateOptionsMenu(final Menu menu) {
// Inflate the menu; this adds items to the action bar if it is present.
getMenuInflater().inflate(R.menu.menu_items, menu);
MenuItem menuItem = menu.findItem(R.id.action_search);
SearchView searchView = (SearchView) MenuItemCompat.getActionView(menuItem);
searchView.setMaxWidth(Integer.MAX_VALUE);
searchView.setOnQueryTextListener(this);
/* // Hide other menu items when searchView clicked
searchView.setOnSearchClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
menu.findItem(R.id.action_sort).setVisible(false);
}
});
// Show other menu items when SearchView closed
searchView.setOnCloseListener(new SearchView.OnCloseListener() {
@Override
public boolean onClose() {
menu.findItem(R.id.action_sort).setVisible(true);
return false;
}
});*/
MenuItemCompat.setOnActionExpandListener(menuItem, new MenuItemCompat.OnActionExpandListener() {
@Override
public boolean onMenuItemActionCollapse(MenuItem item) {
// Do something when collapsed
menu.findItem(R.id.action_sort).setVisible(true);
return true; // Return true to collapse action view
}
@Override
public boolean onMenuItemActionExpand(MenuItem item) {
// Do something when expanded
menu.findItem(R.id.action_sort).setVisible(false);
return true; // Return true to expand action view
}
});
return super.onCreateOptionsMenu(menu);
}
答案 2 :(得分:0)
我遇到了同样的问题,我隐藏它们后无法正确显示其他图标。以下更改对我有用。你可以尝试一下。
1-尝试将ShowAsAction更改为“always”
<item
android:id="@+id/search"
android:title="@string/search"
android:icon="@drawable/ic_search"
app:actionViewClass="android.widget.SearchView"
app:showAsAction="always" />
<item
android:id="@+id/edit"
android:icon="@drawable/ic_edit"
android:title="@string/edit"
app:showAsAction="always" />
2-使用“setOnSearchClickListener”将编辑控件隐藏为:
SearchView searchView = (SearchView) menu.findItem(R.id.search).getActionView();
searchView.setOnSearchClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
menu.findItem(R.id.edit).setVisible(false);
}
});
3-使用“setOnCloseListener”将隐藏控件恢复为:
// Detect SearchView close
searchView.setOnCloseListener(new SearchView.OnCloseListener() {
@Override
public boolean onClose() {
menu.findItem(R.id.edit).setVisible(true);
return false;
}
});
您无需为此工作调用invalidate
答案 3 :(得分:0)
我确实尝试了上述所有解决方案,但没有一个对我有用。我最接近的是@ysfcyln solution,但仍然不够完美。
因此,我将逐步说明解决方案的版本
我面临的关键问题:
一旦我宣布app:showAsAction= collapseActionView
,它就发挥了所有的魔力,即覆盖了整个动作栏并提供了一个后退按钮。
注意:其他actionMenuItem仍然可见。 (问题2)
<menu xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto">
<item
android:id="@+id/action_add"
android:icon="@drawable/ic_baseline_note_add_24px"
android:title="@string/add_note"
app:showAsAction="ifRoom" />
<item
android:id="@+id/action_setting"
android:icon="@drawable/ic_icons_settings"
android:title="@string/action_settings"
app:showAsAction="ifRoom" />
<item
android:id="@+id/action_search"
android:icon="@drawable/ic_search_24px"
android:title="@string/search_hint"
app:actionViewClass="androidx.appcompat.widget.SearchView"
app:showAsAction="always|collapseActionView" />
</menu>
要解决问题2(我隐藏了其他menuItem处于溢出状态),我使用了MenuItem. setOnActionExpandListener。
该代码来自我的项目,目的只是为了提出想法,并根据您的项目进行更改。
override fun onCreateOptionsMenu(menu: Menu, inflater: MenuInflater) {
super.onCreateOptionsMenu(menu, inflater)
...
...
//get all menuItem using the id in onCreateOptionsMenu()
val searchActionMenuItem = menu.findItem(R.id.action_search)
val settingActionMenuItem = menu.findItem(R.id.action_setting)
val addActionMenuItem = menu.findItem(R.id.action_add)
if (searchActionMenuItem is MenuItem) {
searchActionMenuItem.setOnActionExpandListener(object :
MenuItem.OnActionExpandListener {
override fun onMenuItemActionExpand(p0: MenuItem?): Boolean {
settingActionMenuItem.setShowAsAction(MenuItem.SHOW_AS_ACTION_NEVER)
addActionMenuItem.setShowAsAction(MenuItem.SHOW_AS_ACTION_NEVER)
return true
}
override fun onMenuItemActionCollapse(p0: MenuItem?): Boolean {
activity?.invalidateOptionsMenu()
return true
}
})
}
...
...
}
要注意的要点是:
使用setOnActionExpandListener来检查SearchView状态的变化,而不是下面声明的searchView的Listener。
searchView.setOnSearchClickListener { } // Work's as expected
searchView.setOnCloseListener { } // Doesn't get triggered as expected
在MenuItem.SHOW_AS_ACTION_NEVER
内将其他MenuItem的ShowAsAction设置为onMenuItemActionExpand()
,因为一旦SearchView展开,它将迫使其他项进入“溢出菜单”。(更改MenuItem的可见性将不起作用)< / p>
settingActionMenuItem.setShowAsAction(MenuItem.SHOW_AS_ACTION_NEVER)
addActionMenuItem.setShowAsAction(MenuItem.SHOW_AS_ACTION_NEVER)
onMenuItemActionCollapse()
调用的活动的invalidateOptionsMenu()。原因是将“操作菜单”栏重置回其原始状态。
是我的,如果我错过任何情况,请在下面评论。
答案 4 :(得分:-2)
尝试使用第二个菜单应用:showAsAction =&#34; never&#34;