【问题标题】:SearchView in OptionsMenu not full widthOptionsMenu 中的 SearchView 不是全宽
【发布时间】:2013-08-06 10:50:33
【问题描述】:

我有一个可用的 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;
}

【问题讨论】:

    标签: android searchview options-menu


    【解决方案1】:

    我没有创建新布局,而是在 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);
        ....
    

    【讨论】:

    • searchView.setMaxWidth(Integer.MAX_VALUE);解决了问题。
    • android N 正确显示它(可能是屏幕宽度),但 Nexus 6(棉花糖)出现此问题。此解决方案适用于 Nexus 6,而其他解决方案则没有
    • searchView.setMaxWidth(Integer.MAX_VALUE);解决了问题
    • 我的问题正在修复中。谢谢
    • 谢谢,这是唯一对我有用的解决方案!
    【解决方案2】:

    出于某种原因,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 只是支持库添加的属性的任意命名空间(有关详细信息,请参阅Adding Action Items)。

    【讨论】:

    • 这个解决方案对我也很有效。这 10000 是任意数字吗?
    • 这个解决方案对我有用,只是我使用SearchView XML 元素而不是支持小部件。我认为这应该被标记为正确的解决方案。
    • @ThanosF 是的,这是任意的。只需要一些非常高的价值。
    • 不适合我。您是否将 searchview 布局添加为单独的布局文件
    • @NinjaCoder 如果没有布局文件,您必须以编程方式将宽度设置为 match_parent,然后才能正常工作。
    【解决方案3】:

    也许我迟到了,但认为这可能对遇到与我相同问题的人有所帮助。

    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>
    

    它会显示为

    点击搜索会显示为全角

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

    点击搜索

    【讨论】:

    • 你从哪里得到那个过滤器图标?请提供下载链接
    • cool solution searchView.setMaxWidth(Integer.MAX_VALUE);//设置搜索菜单为全宽这个解决了
    【解决方案4】:

    尽管看起来很疯狂,但在我的情况下,问题是这行: app:actionViewClass="android.widget.SearchView" 在 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" />
    

    【讨论】:

      【解决方案5】:

      我有一个类似的问题,搜索栏没有填满整个宽度,(但我没有其他图标)。 我通过添加项目解决了它:

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

      【讨论】:

      • 这听起来很合理。我现在不打算更改工作代码,但我会在你做对的假设下将此答案标记为正确!
      • 不工作,只设置 MaxWidth=10000 将跨越视图但隐藏其他项目
      【解决方案6】:

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

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

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

      【讨论】:

      • 我在 Android 模拟器中尝试了类似的解决方案,但没有成功。但是searchView.setMaxWidth(Integer.MAX_VALUE); 做到了。
      • 我在自定义 SearchView 的构造函数中进行了初始化:init { maxWidth = Integer.MAX_VALUE }
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-05-16
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多