如何使动作栏的搜索视图填满整个动作栏?

14

进入图像描述

我试图在我的应用程序中创建一个操作栏搜索,但在展开状态下,SearchView没有占据整个操作栏宽度(仍然显示其他操作)!

那么,如何使SearchView填充整个操作栏区域(与GMAIL应用程序一样)?


使用actionBarSherlock.. - Sanket Kachhela
请检查我对这个问题的回答:https://dev59.com/8WvXa4cB1Zd3GeqPKY0k#18648708 - Szymon
我正在为4.0及以上版本创建此应用程序,因此我认为我不需要使用actionBarSherLock!有没有办法在普通的actionBar中完成这个功能? - user2364935
是的,有。请查看我的上面的评论。 - Szymon
"yourapp" 只是一个 XML 命名空间。您可以将其更改为更合适的名称 :) - Szymon
显示剩余2条评论
5个回答

30

以上的解决方案都不适用于我。设置SearchView的MaxWidth对我有用:

@Override
public boolean onCreateOptionsMenu(Menu menu) {
    MenuInflater inflater = getMenuInflater();
    inflater.inflate(R.menu.menu_search, menu);
    SearchView searchView = (SearchView)menu.findItem(R.id.menu_search).getActionView();
    searchView.setMaxWidth(Integer.MAX_VALUE);

这样做的缺点是,即使在API级别23上,溢出菜单按钮也会消失。在模拟器中进行了测试。 - cgogolin
嗯,这是一个奇怪的问题,因为我想要做相反的事情,而默认行为对我来说似乎是最大值... - CQM
正是我所需要的。谢谢。 - mihaiconst

11

明白了

这里输入图片描述

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

    MenuItem searchViewItem = menu.findItem(R.id.action_search);
    SearchView searchView = (SearchView) searchViewItem.getActionView();
    searchView.setIconifiedByDefault(false);
    ActionBar.LayoutParams params = new ActionBar.LayoutParams(ActionBar.LayoutParams.MATCH_PARENT, ActionBar.LayoutParams.MATCH_PARENT);
    searchView.setLayoutParams(params);
    searchViewItem.expandActionView();
    return true;
}


<menu xmlns:android="http://schemas.android.com/apk/res/android"
        xmlns:app="http://schemas.android.com/apk/res-auto"
        xmlns:tools="http://schemas.android.com/tools"
        tools:context=".MySwipeTabbedActivity" >
    <item android:id="@+id/action_search"
            android:title="Search"
            android:icon="@android:drawable/ic_menu_search"
            android:showAsAction="always|collapseActionView"
            android:actionViewClass="android.widget.SearchView"
            />
    <item android:id="@+id/action_share"
            android:title="Share"
            android:icon="@android:drawable/ic_menu_share"
            android:showAsAction="ifRoom" />
    <item android:id="@+id/action_settings"
            android:title="Settings"
            android:icon="@android:drawable/ic_menu_preferences"
            android:showAsAction="never" />
</menu>

[可选] 防止searchView折叠:

    searchViewItem.setOnActionExpandListener(new MenuItem.OnActionExpandListener() {
        @Override
        public boolean onMenuItemActionExpand(MenuItem item) {
            return true;
        }

        @Override
        public boolean onMenuItemActionCollapse(MenuItem item) {
            return false; //never collapse
        }
    });

2
你的答案对我有用 :) 另外补充一点,为了避免在使用app compact库时崩溃,应该像这样写 MenuItemCompat.setOnActionExpandListener(searchViewItem, new OnActionExpandListener() ....... - Ramz
2
此外,如果您正在使用新的工具栏API,则应将其更改为:final ActionMenuView.LayoutParams lp = new ActionMenuView.LayoutParams(ActionMenuView.LayoutParams.MATCH_PARENT,ActionMenuView.LayoutParams.MATCH_PARENT); - The Hungry Androider
@Ramz,这对我不起作用。我在这个SSCCE中尝试了一下,但是没有成功。如果您能看一下,我会非常感慕。 - Solace
@TheHungryAndroider 我也尝试过在这个问题中使用了这种方法,但没有帮助。你能看一下吗? - Solace

2

@Hiep给出的答案是正确的,我按照这些步骤来获得我的解决方案。但是我正在使用ActionBarCompact库,所以需要进行一些修改才能使其正常工作。如果你正在使用AppCompact,那么这个解决方案是Hiep的修改版

<?xml version="1.0" encoding="utf-8"?>
<menu xmlns:android="http://schemas.android.com/apk/res/android"
  xmlns:materialdesign="http://schemas.android.com/apk/res-auto" >

<item android:id="@+id/action_search"
      android:title="search"
      android:icon="@drawable/abc_ic_search_api_mtrl_alpha"
      materialdesign:showAsAction="always|collapseActionView"
      materialdesign:actionViewClass="android.support.v7.widget.SearchView" />

</menu>

在主类中的onCreateOptionsMenu方法中:

  @Override
public boolean onCreateOptionsMenu(Menu menu) {

    // Inflate the menu; this adds items to the action bar if it is present.
    getMenuInflater().inflate(R.menu.my_swipe_tabbed, menu);

    MenuItem searchItem = menu.findItem(R.id.action_search);

    SearchView searchView = (SearchView) MenuItemCompat.getActionView(searchItem);



    // Get the SearchView and set the searchable configuration
    SearchManager searchManager = (SearchManager) getSystemService(Context.SEARCH_SERVICE);

    searchView.setSearchableInfo(searchManager.getSearchableInfo(getComponentName()));


    ActionBar.LayoutParams params = new ActionBar.LayoutParams(ActionBar.LayoutParams.MATCH_PARENT, ActionBar.LayoutParams.MATCH_PARENT);
    searchView.setLayoutParams(params);
    searchView.setIconified(false);

     MenuItemCompat.expandActionView(searchItem);

   return super.onCreateOptionsMenu(menu);
}

避免搜索视图折叠:如果您在Appcompact中使用上述方法,它会导致崩溃。因此,请使用此解决方案来避免这种情况。
      MenuItemCompat.setOnActionExpandListener(searchItem, new MenuItemCompat.OnActionExpandListener() {

        /* (non-Javadoc)
         * @see android.support.v4.view.MenuItemCompat.OnActionExpandListener#onMenuItemActionExpand(android.view.MenuItem)
         */
        @Override
        public boolean onMenuItemActionExpand(MenuItem item) {

            return true;
        }

        /* (non-Javadoc)
         * @see android.support.v4.view.MenuItemCompat.OnActionExpandListener#onMenuItemActionCollapse(android.view.MenuItem)
         */
        @Override
        public boolean onMenuItemActionCollapse(MenuItem item) {

            return false;
        }
    });

Thank you


1

只尝试这个,它会起作用并保持所有其他项设置为 ifRoom

<item
    android:id="@+id/action_search"
    app:actionViewClass="android.support.v7.widget.SearchView"
    android:title="@string/action_search"
    app:showAsAction="always"/>

0

是的,我真的很晚 :) 但我想分享另一种替代方案。这个想法就是在SearchView展开时隐藏分组菜单项。

步骤1: 对菜单项进行分组。请确保搜索视图项的showAsActionapp:showAsAction="collapseActionView|always"

<group android:id="@+id/myMenuGroup">
    <item
        android:id="@+id/actionSearch"
        android:icon="@drawable/ic_search"
        android:title="@string/search"
        app:actionViewClass="android.widget.SearchView"
        app:iconTint="@color/textColorVariant2"
        app:showAsAction="collapseActionView|always" />

    <item
        android:id="@+id/actionFilter"
        android:icon="@drawable/ic_filter"
        android:orderInCategory="0"
        android:title="@string/filter"
        app:iconTint="@color/textColorVariant2"
        app:showAsAction="ifRoom" />

        ..... </group>

步骤2:onPrepareOptionsMenu()回调中获取菜单引用

override fun onPrepareOptionsMenu(menu: Menu?): Boolean {
    super.onPrepareOptionsMenu(menu)
    this.menu = menu // this.menu is a global scoped variable
    return true
}

步骤 3MenuItem.OnActionExpandListener 添加到您的活动中,并像下面一样实现 onMenuItemActionExpand()onMenuItemActionCollapse()

override fun onMenuItemActionExpand(p0: MenuItem?): Boolean {
    menu?.setGroupVisible(R.id.myMenuGroup, false)
    return true
}

override fun onMenuItemActionCollapse(p0: MenuItem?): Boolean {
    menu?.setGroupVisible(R.id.myMenuGroup, true)
    return true
}

这种方法将完全扩展SearchViewActionBar内部,即使存在其他menu图标也是如此。

enter image description here

enter image description here


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接