38

我有一个可用的 SearchView,当用户点击搜索图标时,它会在我的 OptionsMenu 中展开。但是,它仅在其他 OptionsMenu 图标之间的可用空间内扩展。在宽屏幕上这很好,但在狭窄的空间中,搜索框中只能显示 5-10 个字符。我希望它覆盖其他图标,例如 Android 联系人应用程序。目前,我正在使用 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;
}
4

6 回答 6

144

我没有创建新布局,而是在 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);
    ....
于 2015-12-02T19:07:53.810 回答
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支持库添加的属性的任意命名空间在哪里(有关更多详细信息,请参阅添加操作项)。

于 2014-05-04T02:02:18.830 回答
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>

它将显示为 在此处输入图像描述

单击搜索时,它将显示为全宽

在此处输入图像描述

如果您将搜索保留为菜单中的第二个或最后一个项目,那么它将像这样显示。

在此处输入图像描述

并点击搜索在此处输入图像描述

于 2017-11-28T11:23:28.417 回答
4

尽管看起来很疯狂,但在我的情况下,问题是这一行: app:actionViewClass="android.widget.SearchView" in menu.xml:

 <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" />
于 2019-02-06T02:47:52.843 回答
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" />
于 2013-10-29T18:45:17.353 回答
2

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

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

@Override
public void setLayoutParams(final ViewGroup.LayoutParams params) {
    params.width = ViewGroup.LayoutParams.MATCH_PARENT;
    super.setLayoutParams(params);
}
于 2016-08-27T12:41:04.177 回答