展开搜索视图以使用整个操作栏(隐藏其他内容)

时间:2015-06-01 15:21:59

标签: android android-actionbar searchview

我的SearchView内有ActionBar,我想在按下搜索图标时使用整个ActionBar,但我只能免费使用ActionBar空间

例如:http://imgur.com/wnjMfWO

我的菜单代码:

<menu xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
tools:context="br.com.moderna.houaiss.activity.SearchActivity" >

<item
    android:id="@+id/search"
    android:actionViewClass="android.widget.SearchView"
    android:icon="@drawable/ic_search_white_48dp"
    android:showAsAction="collapseActionView|always"
    android:title="@string/search"/>
<item
    android:id="@+id/backWardHistory"
    android:icon="@drawable/ic_arrow_back_white_48dp"
    android:showAsAction="always"
    android:title="@string/back_history"/>
<item
    android:id="@+id/forWardHistory"
    android:icon="@drawable/ic_arrow_forward_white_48dp"
    android:showAsAction="always"
    android:title="@string/forward_history"/>
<item
    android:id="@+id/action_home"
    android:orderInCategory="100"
    android:showAsAction="never"
    android:title="@string/action_home"/>
<item
    android:id="@+id/action_about"
    android:orderInCategory="100"
    android:showAsAction="never"
    android:title="@string/action_about"/>
<item
    android:id="@+id/action_configuration"
    android:orderInCategory="100"
    android:showAsAction="never"
    android:title="@string/action_configuration"/>
<item
    android:id="@+id/action_logout"
    android:orderInCategory="100"
    android:showAsAction="never"
    android:title="@string/action_logout"/>

我曾尝试android:showAsAction="ifRoom",但我需要它们始终在ActionBar上,而不是在我的菜单中。

编辑------

感谢@Simas,

我使用setOnActionExpandListener方法来实现这种效果

final MenuItem searchItem = menu.findItem(R.id.search);

    searchItem.setOnActionExpandListener(new OnActionExpandListener() {

        @Override
        public boolean onMenuItemActionExpand(final MenuItem item) {
            SearchActivity.this.setItemsVisibility(menu, searchItem, false);
            return true;
        }

        @Override
        public boolean onMenuItemActionCollapse(final MenuItem item) {
            SearchActivity.this.setItemsVisibility(menu, searchItem, true);
            return true;
        }
    });


private void setItemsVisibility(final Menu menu, final MenuItem exception,
        final boolean visible) {
    for (int i = 0; i < menu.size(); ++i) {
        MenuItem item = menu.getItem(i);
        if (item != exception)
            item.setVisible(visible);
    }
}

4 个答案:

答案 0 :(得分:44)

嗯,你可以在展开SearchView时隐藏所有其他项目来模仿自己:

@Override
public boolean onCreateOptionsMenu(final Menu menu) {
    getMenuInflater().inflate(R.menu.menu_main, menu);

    final MenuItem searchItem = menu.findItem(R.id.search);
    SearchView searchView = (android.widget.SearchView) searchItem.getActionView();

    // Detect SearchView icon clicks
    searchView.setOnSearchClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View v) {
            setItemsVisibility(menu, searchItem, false);
        }
    });
    // Detect SearchView close
    searchView.setOnCloseListener(new SearchView.OnCloseListener() {
        @Override
        public boolean onClose() {
            setItemsVisibility(menu, searchItem, true);
            return false;
        }
    });

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

答案 1 :(得分:6)

这是一个迟到的答案,但您可以将此属性添加到您的菜单项中,并为您完成工作。

app:showAsAction="collapseActionView|always"

这里的关键字是collapseActionView。

答案 2 :(得分:4)

我尝试了这行代码,使searchview扩展了可用的全宽。当操作栏中显示其他项目时,此方法也适用。

searchView.setMaxWidth(android.R.attr.width);

答案 3 :(得分:0)

"collapseActionView" 属性适用于 menu.xml 中的菜单项以隐藏其他内容并添加返回操作按钮-

 <item
    android:id="@+id/action_search"
    android:icon="@drawable/ic_search"
    android:title="@string/search"
    app:actionViewClass="androidx.appcompat.widget.SearchView"
    app:showAsAction="always|collapseActionView" />

在少数情况下,如果它不起作用,我们可以使用 MenuItem.OnActionExpandListener 显式隐藏/显示其他菜单项,如下所示-

        action_search.setOnActionExpandListener(new  MenuItem.OnActionExpandListener() {
        @Override
        public boolean onMenuItemActionExpand(MenuItem item) {
            action_setting.setVisible(false); // to hide item
            return true;
        }

        @Override
        public boolean onMenuItemActionCollapse(MenuItem item) {
            action_setting.setVisible(true); // to show item
            return true;
        }
    });