操作栏 - 隐藏除搜索字段外的所有菜单项

时间:2015-09-29 09:33:41

标签: android android-actionbar menuitem

我的操作栏中有一个包含两个项目的菜单。打开搜索视图后,仍会显示“一支笔”。我怎么能隐藏它?

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>

动作条: search closed

已打开搜索视图的操作栏: search open

我也试过了:

app:showAsAction="collapseActionView|ifRoom"

但在这种情况下,我有:

collapseActionView

我希望得到第二张图片中显示的内容。但编辑图标应该隐藏或最终显示,但作为一个整体。

修改

基于@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但未成功。

5 个答案:

答案 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,但仍然不够完美。

因此,我将逐步说明解决方案的版本

步骤1:

我面临的关键问题:

  • searchView并未涵盖整个操作栏
  • 未显示actionUp按钮

一旦我宣布app:showAsAction= collapseActionView,它就发挥了所有的魔力,即覆盖了整个动作栏并提供了一个后退按钮。

  

注意:其他actionMenuItem仍然可见。 (问题2)

menu.xml

<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:

要解决问题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()。原因是将“操作菜单”栏重置回其原始状态。

是我的,如果我错过任何情况,请在下面评论。

ScreenShot的:

SS1

SS2

SS3

答案 4 :(得分:-2)

尝试使用第二个菜单应用:showAsAction =&#34; never&#34;