Подтвердить что ты не робот

SearchView в OptionsMenu не полная ширина

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

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

Здесь мой элемент xml in для 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;
}
4b9b3361

Ответ 1

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

android:actionLayout="@layout/my_search_view"

и в макете /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" />

Ответ 2

Вместо создания нового макета я устанавливаю 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);
    ....

Ответ 3

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

Ответ 4

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

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>

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

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

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

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

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

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

Ответ 5

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

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

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

Ответ 6

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