Android 当层次结构中有 NestedScrollView 时,不会调整我的布局

Android doesn't resize my layout when there is a NestedScrollView in the hierarchy

我刚刚在使用 Android 7.1.1 和 Android 支持库 25.3.1.

的 Nexus 9 上观察到以下行为

这是我的 activity 的布局:

<?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>

这是它在屏幕上的样子:

当屏幕键盘出现时,系统会调整我的 activity 布局的大小,使其占据从屏幕顶部到键盘的 space。请考虑以下屏幕截图中的红色虚线:

但是,当我将 ScrollView 替换为 NestedScrollView 时,系统不会调整布局大小:

现在红色虚线在键盘下方。通过将 android:windowSoftInputMode="adjustResize" 应用于 activity:

可以轻松解决此问题

红色虚线现在位于键盘上方。我的问题是:

  1. 为什么我会观察到这种行为?
  2. NestedScrollView 怎么了?

这里的问题不是嵌套滚动视图,问题是 Android 在输入法调用时 appears/disappears 键盘自动调整视图。 我希望你能理解下面给出的 link 中的问题:

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

Android docs 说:

When the input method appears on the screen, it reduces the amount of space available for your app's UI. The system makes a decision as to how it should adjust the visible portion of your UI, but it might not get it right. To ensure the best behavior for your app, you should specify how you'd like the system to display your UI in the remaining space.

这可能是所引用的不稳定实例。

在我看来,这不是 NestedScrollViewScrollView 的问题,而是 Activity 如何调整 UI 的问题基于键盘。 NestedScrollViewScrollView 之间的唯一区别是 NestedScrollView 可以同时是 parent and child. 我认为这强调了为什么你应该遵循上面的建议:

To ensure the best behavior for your app, you should specify how you'd like the system to display your UI in the remaining space.

即始终使用 android:windowSoftInputMode="adjustResize",而不是仅在需要时使用。

为什么使用固定尺寸。

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

试试

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

在开始任何事情之前,只需将粗纸制作成您想要的设计即可。

试试这可能适合你。