Панель приложений Android apppartpat растягивается, когда 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>
Edit
Предоставление панели инструментов фиксированной высоты не решает проблему, так как она будет SearchView
исчезать при фокусировке. Изменение силы тяжести любого элемента, похоже, не влияет на SearchView
.
![Normal state]()
![Expanded state]()
![Focused state]()
Ответы
Ответ 1
Хорошо, я понял это. Не было проблем с SearchView
, потому что то же самое произошло с обычным EditText
, который обычно помещался внутри макета 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"
в корневом каталоге node макета активности заставила все работать нормально.
Итак, для любого, кто это прочитает: если у вас есть <item name="android:windowTranslucentStatus">true</item>
в вашей теме, убедитесь, что любой root node, содержащий панель инструментов, содержит 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>
Ответ 2
У меня была та же проблема, что и у OP, я попробовал решение android:fitsSystemWindows="true"
, но он был наполовину разрешен: searchview больше не расширялся, но панель уведомлений (верхняя часть экрана) стала полностью белой (как и макет) вместо красного (моя тема приложения).
Я нашел альтернативный способ, и он работает как шарм, поэтому для тех, кто застрял, попробуйте следующее:
В манифесте просто добавьте эту строку в свой раздел активности:
Android: windowSoftInputMode = "adjustPan"
Пример:
<activity
android:name=".MainActivity"
android:windowSoftInputMode="adjustPan"
android:label="My main activity" >
</activity>
Ответ 3
У меня была такая же проблема, как это, но я не помогал выше ответам, но после многих поисков что-то нашел.
может помочь вам.!!
после добавления этого атрибута в 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>
Ответ 4
Принятый ответ работает отлично, однако мне нужна была альтернатива, позволяющая просматривать панель инструментов в полупрозрачной строке состояния.
Проблема заключается в том, что на панели инструментов используются прокладки для покрытия компонентов системы. В результате при заполнении панели на панели инструментов устанавливается мягкая высота клавиатуры всякий раз, когда появляется клавиатура. Решение заключалось в reset заполнении перед вызовом super.onMeasure в моем классе панели инструментов:
public class MyToolbar extends Toolbar {
(...)
@Override
protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {
setPadding(getPaddingLeft(), getPaddingTop(), getPaddingRight(), 0);
super.onMeasure(widthMeasureSpec, heightMeasureSpec);
}
}
Ответ 5
У меня была та же проблема с 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>
Ответ 6
У меня возникла аналогичная проблема, и установка showAsAction="always|collapseActionView"
внутри пункта меню поиска (menu.xml) разрешила растягивание панели инструментов для меня.
Ответ 7
Я хотел бы поделиться своим опытом, но до этого хочу отказаться от этого комментария. До сих пор я действительно нахожу этот CoordinatorLayout
shenanigans багги и не достоин быть сброшенным в SDK. Его просто багги. Когда он ведет себя так же неустойчиво, архитектура в макете xml не очень помогает понять, что происходит. Я последовал за примерами, и никто из них не работал.
Сказав это, я использую версию инструментов для сборки v24.0.2 (последняя из этих статей), и моя ситуация может отличаться от остальных. Поэтому я помещаю этот ответ вместе с другими ответами здесь.
В моем случае я использую эту library для 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 на этом посту исправить это для меня, и я цитирую его ответ:
Я нашел ответ в этой ссылке: Строка состояния Цвет не меняется с Относительная компоновка как корневой элемент
Итак, оказывается, нам нужно удалить
<item name="android:statusBarColor">@android:color/transparent</item> in
styles.xml(V21). И это работает отлично для меня.
Моя единственная проблема заключается в том, как это решение будет доступно в предстоящих обновлениях. CoordinatorLayout
не должно вести себя так.
Ответ 8
Если вы используете EditText внутри Панели инструментов, добавив в imeOptions флаг flagNoExtractUi, вы сможете решить область редактирования растяжения.
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" />