【问题标题】:How to make the Action Bar SearchView fill Entire action bar?如何使操作栏 SearchView 填充整个操作栏?
【发布时间】:2013-09-11 09:29:53
【问题描述】:

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

那么,如何让 SearchView 填满整个 ActionBar 区域(如在 GMAIL 应用中)?

【问题讨论】:

  • 使用 actionBarSherLock ..
  • 查看我对这个问题的回答:stackoverflow.com/questions/13660225/…
  • 我正在为 4.0 及更高版本创建这个应用程序,所以我认为我不需要使用 actionBarSherLock!有没有办法在正常的 actionBar 中做到这一点?
  • 是的,有。检查我上面的评论。
  • @st.好的,我会检查它..这是什么“yourapp”?

标签: android user-interface android-actionbar uisearchbar


【解决方案1】:

以上解决方案都不适合我。设置 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 上也会消失。在模拟器中测试。
  • hm 这是一个奇怪的问题,因为我想做相反的事情,而默认行为现在对我来说似乎是最大值......
  • 正是我需要的。谢谢
【解决方案2】:

知道了

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

【讨论】:

  • 你的答案对我有用 :) 这个答案的一个添加 n 是为了避免在我们使用 app compact lib 时崩溃,它应该像这样 MenuItemCompat.setOnActionExpandListener(searchViewItem, new OnActionExpandListener() .. .....否则应用程序将崩溃
  • 要补充一点,如果您使用的是新的 Toolbar API,您可以将其更改为: final ActionMenuView.LayoutParams lp = new ActionMenuView.LayoutParams(ActionMenuView.LayoutParams.MATCH_PARENT, ActionMenuView.LayoutParams. MATCH_PARENT);
  • @Ramz 这对我不起作用。我试过这个in this SSCCE,但没有用。如果您能调查一下,我将不胜感激。
  • @TheHungryAndroider 我也试过in this problem,但没有帮助。你能调查一下吗?
【解决方案3】:

@Hiep 给出的答案是正确的,我按照这些步骤获得了我的解决方案。但我使用的是 ActionbarCompact lib,因此需要进行一些更改才能使其正常工作此解决方案只是修改后的答案如果您使用的是 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);
}

避免 searchView 崩溃:如果您在 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;
        }
    });

谢谢

【讨论】:

    【解决方案4】:

    Try This Only 将起作用并将所有其他项目设置为 ifRoom

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

    【讨论】:

      【解决方案5】:

      是的,我真的迟到了 :) 但我想分享另一种替代解决方案。这个想法只是在 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>
      

      第二步:onPrepareOptionsMenu()回调中获取菜单引用

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

      第 3 步MenuItem.OnActionExpandListener 添加到您的活动中并实现onMenuItemActionExpand()onMenuItemActionExpand(),如下所示

      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
      }
      

      即使存在其他menu 图标,这种方法也会将SearchView 完全扩展到ActionBar

      【讨论】: