OptionsMenu中的SearchView没有全宽显示

39

我有一个工作中的SearchView,当用户点击搜索图标时,在我的OptionsMenu中扩展。然而,它只在其他OptionsMenu图标之间可用空间内展开。在宽屏上这没问题,但在狭窄的空间里,只有能显示5-10个字符的搜索框。我希望它可以像Android Contacts应用程序一样覆盖其他图标。目前,我正在使用targetSdkVersion = 17 进行构建。希望我没有漏掉什么简单的问题 :)

(稍后添加说明:到目前为止,我找到的唯一可行的解决方案是隐藏所有菜单图标,当我想要展开搜索图标时。这在概念上很简单。但这很麻烦,因为在恢复隐藏的图标时,必须通过一堆逻辑来确定要恢复哪些图标,或者保留状态变量等。)

这是我的OptionsMenu中项的xml:

<item
  android:id="@+id/menu_search_shallow"
  android:title="Search Current Folder"
  android:icon="@drawable/ic_btn_search"
  android:showAsAction="always|collapseActionView"
  android:actionViewClass="android.widget.SearchView" />

我在我的主要活动代码中也有:

@Override
public boolean onCreateOptionsMenu (Menu menu)
{
  getMenuInflater().inflate(R.menu.nav_menu, menu);
  this.optionsMenu = menu;

  MenuItem searchItem = menu.findItem (R.id.menu_search_shallow);
  searchItem.setOnActionExpandListener (this);
  SearchView searchView = (SearchView) searchItem.getActionView();
  searchView.setQueryHint (getString (R.string.search_shallow_hint));

  searchItem = menu.findItem (R.id.menu_search_deep);
  searchItem.setOnActionExpandListener (this);
  searchView = (SearchView) searchItem.getActionView();
  searchView.setQueryHint (getString (R.string.search_deep_hint));
}

@Override
public boolean onMenuItemActionExpand(MenuItem item) 
{
  SearchView searchView = (SearchView) item.getActionView();
  searchView.setOnQueryTextListener (this);
  return true;
}

@Override
public boolean onMenuItemActionCollapse(MenuItem item) 
{
  SearchView searchView = (SearchView) item.getActionView();
  searchView.setQuery ("", false);
  return true;
}
6个回答

145

我没有创建新的布局,而是在onCreateOptionsMenu()中以编程方式设置了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);
    ....

7
searchView.setMaxWidth(Integer.MAX_VALUE);解决了这个问题。 - Rahul Upadhyay
4
安卓 N 版本显示正确(可能是因为屏幕宽度),但 Nexus 6(棉花糖版本)出现了这个问题。这个解决方案适用于 Nexus 6,而其他的则不行。 - behelit
searchView.setMaxWidth(Integer.MAX_VALUE); 解决了这个问题。 - Tigran Sarkisian
谢谢,这是我唯一有用的解决方案! - Roberto Conte Rosito
谢谢!这正是我在寻找的。 - Daria Kirsanova
显示剩余4条评论

15

由于某些原因,jjung的解决方案对我不起作用。我不得不添加android:maxWidth="10000dp",即一个非常高的maxWidth,才能使其扩展到完整的可用宽度。

此外,只是为了补充说明,我正在使用支持库(v7),所以我的布局文件看起来像这样:

<android.support.v7.widget.SearchView xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:maxWidth="10000dp" />

而在我的项目中,我有:

<menu xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:myapp="http://schemas.android.com/apk/res-auto">
    <item
        ...
        myapp:actionLayout="@layout/searchview" />
...

其中myapp只是支持库所添加属性的任意命名空间(有关更多详细信息,请参阅添加操作项)。


1
太好了,这个解决方案对我也有效。这个10000是任意的数字吗? - ThanosFisherman
1
这个方法对我有效,但是我在使用SearchView的XML元素而不是支持部件。我认为这应该被标记为正确的解决方案。 - qefzec
@ThanosF 是的,这是任意的。只需要一些非常高的值即可。 - mchristie
对我来说不起作用。你是否将searchview布局添加为单独的布局文件? - NinjaCoder
1
@NinjaCoder 如果没有布局文件,你必须以编程方式设置宽度为match_parent,然后它才能正常工作。 - 0101100101
它在三星Tab4 7上无法工作,但在我的Nexus上可以。奇怪的情况:x - JFouad

12

也许我来晚了,但我认为对于像我一样遇到同样问题的人可能会有所帮助。

final SearchView searchView = (SearchView) myActionMenuItem.getActionView();
searchView.setMaxWidth(Integer.MAX_VALUE);//set search menu as full width

在您的类的onCreateOptionsMenu方法中可能会解决这个问题,但有一件事情我们需要了解。如果您只想在单击搜索按钮时显示搜索菜单(而不是任何其他操作栏菜单项),则需要将搜索项作为菜单文件中的第一项。以下是一个示例:

        <?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">

<!--keeping searach as first item-->
        <item
            android:id="@+id/action_search"
            android:icon="@drawable/search_ab"
            android:title="@string/search"
            app:actionViewClass="android.support.v7.widget.SearchView"
            app:showAsAction="ifRoom" />

        <item
            android:id="@+id/itemFilter"
            android:icon="@drawable/filter"
            android:title="@string/filter"
            app:showAsAction="ifRoom" />
    </menu>

点击后会显示为输入图像描述

点击搜索后,它将显示为全宽

输入图像描述

如果您将搜索保持为菜单中的第二个或最后一个项目,则会显示如下。

输入图像描述

并且在单击搜索时,输入图像描述


你从哪里得到那个筛选图标的?请提供一个下载链接。 - Prajwal Waingankar
酷炫的解决方案 searchView.setMaxWidth(Integer.MAX_VALUE);//将搜索菜单设置为全宽 问题已解决 - Amin Pinjari

4
尽管看起来很疯狂,但在我的情况下,问题出在menu.xml文件中的这一行代码:app:actionViewClass="android.widget.SearchView"
 <item
        android:id="@+id/action_search"
        app:actionViewClass="android.widget.SearchView"
        android:icon="@drawable/ic_search"
        android:title="@string/title"
        app:actionLayout="@layout/layout_search"
        app:showAsAction="always" />

当我移除了 app:actionViewClass,它就完全按照我的 layout_search 文件定义展开了。
<android.support.v7.widget.SearchView xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:maxWidth="10000dp"
android:layout_centerInParent="true"
android:background="@color/colorAccent"
android:queryHint="Search me" />

3

我曾遇到类似的问题,即搜索栏未填满整个宽度(但没有其他图标)。我通过添加以下项来解决:

android:actionLayout="@layout/my_search_view"

在 layout/my_search_view.xml 中:

<?xml version="1.0" encoding="utf-8"?>
<SearchView xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="wrap_content" />

这听起来很合理。我现在不会更改工作代码,但是在您正确的假设下,我将把这个答案标记为正确! - Peri Hartman
2
不要使用,只需将MaxWidth设置为10000即可跨越视图但隐藏其他项目。 - Hiep

2

有很多方法可以解决这个问题 - 我只会添加我在几个应用程序中使用过的方法。

我有自己定制的 SearchView(还有其他一些自定义),它扩展了 android.support.v7.widget.SearchView,为了将其拉伸到全宽:

@Override
public void setLayoutParams(final ViewGroup.LayoutParams params) {
    params.width = ViewGroup.LayoutParams.MATCH_PARENT;
    super.setLayoutParams(params);
}

2
我在Android模拟器中尝试了类似的解决方案,但它没有起作用。但是searchView.setMaxWidth(Integer.MAX_VALUE);可以。 - CoolMind
我在自定义SearchView的构造函数中进行了初始化: init { maxWidth = Integer.MAX_VALUE } - Daniil

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