Панель инструментов Android appcompat растягивается, когда searchview получает фокус

Я обновляю приложение, чтобы использовать новую Toolbar вместо обычного ActionBar . В моем приложении пользователь должен иметь возможность выбрать контакт из своего списка контактов. Для этого я добавил в меню SearchView . Контакты уже находятся в списке; SearchView используется для фильтрации списка с использованием ArrayAdapter.getFilter() .

Все это отлично работало с помощью ActionBar , но высота Toolbar растягивается сразу за клавиатурой. Используя проверку XML с Android Device Monitor, я вижу, что ListView существует за моей клавиатурой.

Кажется, что SearchView хочет отображать предложения, но у меня нет такой настройки. Любая идея, что происходит не так?

Изображения иллюстрируют проблему. Они показывают нормальное, расширенное и сфокусированное состояние SearchView .

Это мое меню XML:

 <?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"> <item android:id="@+id/action_forwarding_contact_search" app:showAsAction="always" android:title="@string/forwarding_contact_search" app:actionViewClass="android.support.v7.widget.SearchView" android:icon="@drawable/abc_ic_search_api_mtrl_alpha"/> </menu> 

Редактировать Предоставление панели инструментов фиксированной высоты не решает проблему, потому что это приведет SearchView исчезновению SearchView когда он имеет фокус. Изменение гравитации любого элемента, похоже, не влияет на SearchView .

Нормальное состояниеРасширенное состояниеСосредоточенное состояние

У меня была та же проблема, что и у OP, я попробовал решение android:fitsSystemWindows="true" , но оно было разрешено наполовину: поисковый запрос больше не расширялся, но панель уведомлений (верхняя часть экрана) стала полностью белой (например, фон макета ) Вместо красного (моя тема приложения).

Я нашел альтернативный способ, и он работает как шарм, поэтому для тех, кто застрял, попробуйте следующее:

В своем манифесте просто добавьте эту строку в свой раздел активности:

андроид: windowSoftInputMode = "adjustPan"

Пример:

 <activity android:name=".MainActivity" android:windowSoftInputMode="adjustPan" android:label="My main activity" > </activity> 

Хорошо, я понял это. Не было никаких проблем с SearchView , потому что то же самое происходило с обычными EditText s, которые обычно размещались внутри макета xml. Toolbar тоже не были проблемой.

Я создал пустую деятельность и играл со всем, что я изменил в своем приложении, и, наконец, пришел к своей теме. В KitKat, а позже я установил <item name="android:windowTranslucentStatus">true</item> на тему, поэтому навигационный ящик появится за панель состояния.

Отключение / удаление этого разрешит проблему. Это напомнило мне свойство android:fitsSystemWindows="true" . Он установлен на Toolbar , но не в макете xml основного действия, которое содержит DrawerLayout . Я думаю, DrawerLayout устанавливает себя в соответствии с системными окнами. Например, здесь нет свойства fitSystemWindows :

 <android.support.v4.widget.DrawerLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:tools="http://schemas.android.com/tools" android:id="@+id/drawer_layout" android:layout_width="match_parent" android:layout_height="match_parent" tools:context=".DashboardActivity"> 

Активность, в которой возникла проблема, не имела NavigationDrawer , это была новая деятельность. Настройка android:fitsSystemWindows="true" в корневом узле макета активности, благодаря чему все работает нормально.

Итак, для любого, кто это прочитает: если у вас есть <item name="android:windowTranslucentStatus">true</item> в вашей теме, убедитесь, что любой корневой узел, содержащий панель инструментов, содержит android:fitsSystemWindows="true" .

Рабочий образец:

 <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="match_parent" android:layout_height="match_parent" android:fitsSystemWindows="true" android:orientation="vertical"> <include layout="@layout/toolbar" /> <LinearLayout android:layout_width="match_parent" android:layout_height="match_parent" android:orientation="vertical"> <EditText android:id="@+id/editText" android:layout_width="match_parent" android:layout_height="wrap_content" android:singleLine="true" /> <Button android:id="@+id/button2" android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="New Button" /> </LinearLayout> </LinearLayout> 

У меня была такая же проблема, как это, но я не помогал выше ответам, но после многих поисков что-то нашел.

Может помочь вам тоже. !!

После добавления этого атрибута в toolbar

android:layout_height="?attr/actionBarSize"

 <android.support.v7.widget.Toolbar xmlns:android="http://schemas.android.com/apk/res/android" style="@style/ToolBarStyle" android:layout_width="match_parent" android:layout_height="?attr/actionBarSize" android:background="@color/myPrimaryColor" android:minHeight="@dimen/abc_action_bar_default_height_material" > <TextView android:id="@+id/toolbar_title" android:layout_width="wrap_content" android:layout_height="wrap_content" android:textSize="18sp" android:textColor="@color/myTextPrimaryColor" android:layout_gravity="center" /> </android.support.v7.widget.Toolbar> 

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

Проблема в том, что на панели инструментов используются прокладки для покрытия компонентов системы. В результате при заполнении панели на панели инструментов устанавливается высота мягкой клавиатуры всякий раз, когда появляется клавиатура. Решение заключалось в том, чтобы сбросить заполнение до вызова super.onMeasure в моем классе панели инструментов:

 public class MyToolbar extends Toolbar { (...) @Override protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) { setPadding(getPaddingLeft(), getPaddingTop(), getPaddingRight(), 0); super.onMeasure(widthMeasureSpec, heightMeasureSpec); } } 

Я столкнулся с подобной проблемой, и установка showAsAction="always|collapseActionView" внутри пункта меню поиска (menu.xml) решила растягивание панели инструментов для меня.

У меня была та же проблема с SearchView на панели инструментов с TextView и Spinner в ней. Закрытие SearchView (либо нажатием кнопки «Назад на панели инструментов», либо переключением на другую вкладку в ViewPager) заставило панель инструментов растягиваться чуть ниже верхней части клавиатуры.

Я решил это, разместив дополнительный макет вокруг представлений на панели инструментов.

До:

 <android.support.v7.widget.Toolbar xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="match_parent" android:layout_height="wrap_content"> <TextView android:layout_width="match_parent" android:layout_height="match_parent"/> <Spinner android:layout_width="wrap_content" android:layout_height="wrap_content"/> </android.support.v7.widget.Toolbar> 

После

 <android.support.v7.widget.Toolbar xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="match_parent" android:layout_height="wrap_content"> <LinearLayout android:layout_width="match_parent" android:layout_height="match_parent" android:orientation="horizontal"> <TextView android:layout_width="match_parent" android:layout_height="match_parent"/> <Spinner android:layout_width="wrap_content" android:layout_height="wrap_content"/> </LinearLayout> </android.support.v7.widget.Toolbar> 

Я хотел бы поделиться своим опытом, но до этого хочу отказаться от этого комментария. До сих пор я действительно нахожу этот CoordinatorLayout Layout shenanigans багги и не достоин быть сброшенным в SDK. Его просто багги. Когда он ведет себя так же неустойчиво, архитектура в макете xml не очень помогает понять, что происходит. Я последовал религиозным примерам, и никто из них не работал.

Сказав это, я использую версию инструментов для сборки v24.0.2 (последняя из этих статей), и моя ситуация может отличаться от остальных. Поэтому я помещаю этот ответ вместе с другими ответами здесь.

В моем случае я использую эту библиотеку для NavigationDrawer

Как указывали некоторые ответы, это навигационный ящик. Я попытался не использовать эту библиотеку и все еще имею проблему. У меня есть CoordinatorLayout в качестве родительского макета двух моих действий и программно вставляет NavigationDrawer как указано автором библиотеки. Расширяющаяся Toolbar размер экрана при фокусировке на EditText все еще существует. Поэтому в моем случае проблема не идет оттуда.

Вот что я сделал в моем случае:

Я удалил fitsSystemWindows из схемы CoordinatorLayout активности. Вопреки тому, что здесь предлагали другие люди.

Я вставляю весь свой макет деятельности здесь:

 <?xml version="1.0" encoding="utf-8"?> <android.support.design.widget.CoordinatorLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:app="http://schemas.android.com/apk/res-auto" xmlns:tools="http://schemas.android.com/tools" android:id="@+id/coordinatorlayout_homescreen" android:layout_width="match_parent" android:layout_height="match_parent" tools:context=".activity.HomeScreenActivity"> <android.support.design.widget.AppBarLayout android:layout_width="match_parent" android:layout_height="wrap_content" android:fitsSystemWindows="true" android:theme="@style/AppTheme.AppBarOverlay"> <android.support.design.widget.CollapsingToolbarLayout android:id="@+id/collapsingtoolbarlayout_homescreen" android:layout_width="match_parent" android:layout_height="wrap_content" android:fitsSystemWindows="true" app:contentScrim="?attr/colorPrimary" app:expandedTitleMarginStart="64dp" app:expandedTitleMarginEnd="48dp" app:layout_scrollFlags="scroll|enterAlwaysCollapsed"> <android.support.v7.widget.Toolbar android:id="@+id/toolbar_homescreen" android:layout_width="match_parent" android:layout_height="wrap_content" android:fitsSystemWindows="true" app:layout_collapseMode="pin"/> </android.support.design.widget.CollapsingToolbarLayout> </android.support.design.widget.AppBarLayout> <android.support.v4.widget.NestedScrollView android:layout_width="match_parent" android:layout_height="match_parent" app:layout_behavior="@string/appbar_scrolling_view_behavior"> <FrameLayout android:id="@+id/framelayout_homescreen" android:layout_width="match_parent" android:layout_height="match_parent" /> </android.support.v4.widget.NestedScrollView> <!-- <android.support.design.widget.FloatingActionButton android:id="@+id/fab_homescreen" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_gravity="bottom|end" android:layout_margin="@dimen/fab_margin" android:src="@android:drawable/ic_dialog_email" /> --> </android.support.design.widget.CoordinatorLayout> 

Я сделал это на другом мероприятии, и он работает так, как ожидалось. У меня больше нет расширяющейся Toolbar . Но эта проблема возникла. Я собираюсь вытащить волосы. Строка состояния стала белой. Решение Phoenix Wang на этом посту исправить это для меня, и я цитирую его ответ:

Я нашел ответ в этой ссылке: Строка состояния Цвет не изменяется с помощью Relative Layout как корневой элемент

Итак, оказывается, нам нужно удалить

  <item name="android:statusBarColor">@android:color/transparent</item> in 

styles.xml (V21). И это работает отлично для меня.

Моя единственная проблема заключается в том, как это решение сохранится в предстоящих обновлениях. CoordinatorLayout не должен вести себя так.

Если вы используете EditText внутри панели инструментов, добавив «flagNoExtractUi» в imeOptions, вы разрешите область редактирования растяжения.

EditText для поиска Действие без растягивания:

 android:id="@+id/toolbar_editText" android:layout_height="wrap_content" android:layout_width="wrap_content" android:inputType="text" android:imeOptions="actionSearch|flagNoExtractUi" android:singleLine="true" /> 

Intereting Posts
Категория предпочтений андроида Перечислители ListView сверху и снизу элемента ListView Файл не загружен полностью Исключение SocketIO при использовании Android-клиента для socketIO Как ждать нескольких вложенных асинхронных вызовов с помощью RxJava-Android? Вход для зарегистрированных пользователей с Instagram android Android Studio говорит использовать Gradle 1.10 – но новая версия 1.12? Могу ли я запустить Android Studio (эмулятор Android SDK) на виртуальной машине Microsoft-Hyper-V? Проблемы с запуском платформы эмулятора Android 4.0 4.0 IllegalStateException: не удалось найти метод insert (View) у родителя или предка. Контекстный класс android.support.v7.widget.AppCompatButton Есть ли эквивалент setColorFilter () в XML? Как найти правильное расстояние между двумя геотомами на карте? Как я могу вычислить высоту и ширину экрана во время выполнения? Android 2.3 Browser не удается отобразить некоторые 2D-преобразования CSS3 Как выводить целое число с помощью методов TextView?