Android не изменяет размер моего макета, когда в иерархии есть NestedScrollView

Я только что заметил следующее поведение на своем Nexus 9 с Android 7.1.1 и Android Support Library 25.3.1.

Вот мой макет деятельности:

<?xml version="1.0" encoding="utf-8"?>
<ScrollView xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="match_parent">

    <LinearLayout
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:focusableInTouchMode="false"
        android:orientation="vertical"
        android:paddingBottom="4dp">

        <EditText
            android:layout_width="match_parent"
            android:layout_height="wrap_content" />

        <View
            android:layout_width="match_parent"
            android:layout_height="300dp"
            android:background="#fffaaa" />

        <View
            android:id="@+id/view"
            android:layout_width="match_parent"
            android:layout_height="300dp"
            android:background="#bbbaaa" />

        <View
            android:layout_width="match_parent"
            android:layout_height="10dp"
            android:background="#f00" />

    </LinearLayout>
</ScrollView>

Вот как это выглядит на экране:

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

Когда появляется экранная клавиатура, система меняет размеры моего макета активности, поэтому занимает пространство от верхней части экрана до клавиатуры. Пожалуйста, рассмотрите пунктирную красную линию на скриншоте ниже:

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

Однако, когда я заменяю ScrollView на NestedScrollView, система не изменяет размер макета:

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

Теперь пунктирная красная линия находится под клавиатурой. Проблема может быть легко устранена путем применения android:windowSoftInputMode="adjustResize" к активности:

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

Теперь красная пунктирная линия находится выше клавиатуры. Мои вопросы:

  • Почему я наблюдаю такое поведение?
  • Что случилось с NestedScrollView?

Ответы

Ответ 1

Android docs говорят:

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

Это может быть экземпляр нестабильности, на которую ссылаются.

Мне кажется, что это не проблема с NestedScrollView и ScrollView, но это больше проблема с тем, как Activity корректирует пользовательский интерфейс на основе клавиатуры. Единственная разница между NestedScrollView и ScrollView заключается в том, что NestedScrollView может быть как родительским, так и дочерним.. Я думаю, это подчеркивает, почему вы должны следовать над советом, где говорится:

Чтобы обеспечить наилучшее поведение вашего приложения, вы должны указать, как вы как система для отображения вашего пользовательского интерфейса в оставшемся пространстве.

т.е. используя android:windowSoftInputMode="adjustResize" всегда, а не только тогда, когда это необходимо.

Ответ 2

Проблема здесь не в Nested Scroll-view, проблема в настройке Android Auto, когда клавиатура появляется/исчезает при вызове метода ввода. Надеюсь, вы поймете проблему в приведенной ниже ссылке:

https://developer.android.com/training/keyboard-input/visibility.html