SearchView в OptionsMenu не на всю ширину

У меня есть рабочий SearchView, который расширяется в моем OptionsMenu, когда пользователь нажимает на значок поиска. Однако он расширяется только в доступном пространстве среди других значков OptionsMenu. На широком экране это нормально, но при узком пространстве в поисковой строке можно показать только 5-10 символов. Я хочу, чтобы он перекрывал другие значки, например, для приложения Android Contacts. В настоящее время я строю с targetSdkVersion = 17. Надеюсь, мне не хватает чего-то простого :)

(Примечание добавлено позже: пока единственное решение, которое я нашел работоспособным, — это скрыть все значки меню, когда я хочу развернуть значок поиска. Это концептуально просто. Но это беспорядочно, потому что при восстановлении скрытых значков один должен пройти через кучу логики, чтобы выяснить, какие из них следует восстановить или сохранить переменные состояния и т. д.)

Вот мой элемент xml для OptionsMenu:

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

person Peri Hartman    schedule 05.08.2013    source источник


Ответы (6)


У меня была аналогичная проблема, что панель поиска не заполняла всю ширину (но у меня не было других значков). Я решил это, добавив в пункт:

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" />
person jjung    schedule 29.10.2013
comment
Это звучит разумно. Я не собираюсь менять рабочий код прямо сейчас, но я отмечу этот ответ как правильный, предполагая, что вы все поняли правильно! - person Peri Hartman; 30.10.2013
comment
не работает, только установка MaxWidth=10000 будет охватывать вид, но скрывать другие элементы - person Hiep; 02.08.2014

Вместо создания нового макета я программно установил MaxWidth в onCreateOptionsMenu():

@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);
    ....
person LyteSpeed    schedule 02.12.2015
comment
searchView.setMaxWidth(Integer.MAX_VALUE); решил проблему. - person Rahul Upadhyay; 23.12.2015
comment
Android N отобразил его правильно (может быть, ширина экрана), но Nexus 6 (зефир) демонстрирует эту проблему. Это решение работало для Nexus 6, а другие нет. - person behelit; 11.03.2016
comment
searchView.setMaxWidth(Integer.MAX_VALUE); решил проблему - person Tigran Sarkisian; 16.03.2016
comment
моя проблема исправлена. Спасибо - person saranya; 02.02.2017
comment
Спасибо, это единственное полезное для меня решение! - person Roberto Conte Rosito; 08.03.2017
comment
да, это решило проблему с тем, что кнопка закрытия немного левее, а не крайняя правая проблема, в Galaxy Note 5 и Moto Nexus 6. Спасибо. - person Devavrata; 28.05.2017
comment
Этот трюк - ОП! :) Решено также в Nexus 10 в ландшафтном режиме - person Giacomo Mattiuzzi; 28.06.2017
comment
Спасибо, Решил мою проблему в ландшафтном режиме. - person Manikandan K; 10.08.2018
comment
Спасибо! Это именно то, что я искал. - person Daria Kirsanova; 27.04.2020

По какой-то причине решение jjung у меня не сработало. Мне пришлось добавить android:maxWidth="10000dp", просто очень большую максимальную ширину, чтобы он расширился до полной доступной ширины.

Кроме того, просто добавлю, что я использую библиотеку поддержки (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 — это просто произвольное пространство имен для атрибутов, добавленных библиотекой поддержки (см. Добавление элементов действий для более подробной информации).

person mchristie    schedule 04.05.2014
comment
отлично, это решение сработало и для меня. Является ли это 10000 произвольным числом? - person ThanosFisherman; 23.04.2015
comment
Это решение сработало для меня, только я использую XML-элемент SearchView вместо виджета поддержки. Я думаю, что это должно быть помечено как правильное решение. - person qefzec; 03.05.2015
comment
@ThanosF Да, это произвольно. Просто нужно какое-то действительно высокое значение. - person mchristie; 04.05.2015
comment
Не работает для меня. Вы добавили макет поиска в виде отдельного файла макета - person NinjaCoder; 21.07.2015
comment
@NinjaCoder Без файла макета вы должны программно установить ширину match_parent, тогда это сработает. - person 0101100101; 06.08.2015
comment
это не работает на samsung tab4 7, но работает с моим нексусом. странная ситуация :х - person JFouad; 24.10.2015

Может быть, я опаздываю, но подумал, что это может быть полезно для тех, кто столкнулся с той же проблемой, что и я.

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>

И он будет отображаться как введите здесь описание изображения

при нажатии на поиск он будет отображаться во всю ширину

введите описание изображения здесь

И если вы сохраните поиск вторым или последним пунктом в меню, он будет отображаться следующим образом.

введите описание изображения здесь

и щелкнув поисквведите здесь описание изображения

person Kishan Solanki    schedule 28.11.2017
comment
откуда у тебя этот значок фильтра? пожалуйста дайте ссылку для скачивания - person Prajwal Waingankar; 16.07.2019
comment
классное решение searchView.setMaxWidth(Integer.MAX_VALUE);//установить меню поиска на полную ширину, это решено - person Amin Pinjari; 16.07.2019

Каким бы безумным это ни казалось, в моем случае проблема заключалась в этой строке: 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" />
person daneejela    schedule 06.02.2019

Есть так много способов решить эту проблему — я просто добавлю тот, который использовал в нескольких приложениях.

У меня есть собственный SearchView (с некоторыми другими настройками), который расширяет android.support.v7.widget.SearchView, и для того, чтобы растянуться на всю ширину:

@Override
public void setLayoutParams(final ViewGroup.LayoutParams params) {
    params.width = ViewGroup.LayoutParams.MATCH_PARENT;
    super.setLayoutParams(params);
}
person Oleksandr    schedule 27.08.2016
comment
Я попробовал подобное решение в эмуляторе Android, и оно не сработало. Но searchView.setMaxWidth(Integer.MAX_VALUE); сделал. - person CoolMind; 04.05.2017
comment
Я выполнил инициализацию в своем собственном конструкторе SearchView: init { maxWidth = Integer.MAX_VALUE } - person Daniil; 20.11.2019