Панель приложений 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 stateExpanded stateFocused 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" />