ScrollView 的顶部隐藏在状态栏后面

Top of ScrollView hidden behind status bar

我有一个 FrameLayout,其中包含用于背景的 ImageViewScrollView 中的 LinearLayout 以显示我需要的所有视图。简化代码显示在下方,用于我的 Fragment

<FrameLayout 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:layout_width="match_parent"     
    android:layout_height="match_parent">

    <ImageView
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:src="@drawable/ink"
        android:scaleType="center"/>

    <ScrollView
        android:layout_width="match_parent"
        android:layout_height="match_parent">

        <LinearLayout
            android:id="@+id/linear_layout_container"
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:layout_gravity="center"
            android:orientation="vertical">
        </LinearLayout>

   </ScrollView>
</FrameLayout>

这个片段放在我的 activity_main.xmlFrameLayout 中,看起来像这样

<FrameLayout
    xmlns:android="http://schemas.android.com/apk/res/android"

    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:fitsSystemWindows="true"
    >
</FrameLayout>

当项目高度总和大于屏幕高度时 ScrollView 开始,我可以按预期滚动 LinearLayout 内的所有项目。

问题是当我滚动到 LinearLayout 顶部时,最上面的视图隐藏在状态栏后面,如下图所示:

我正在寻找的行为是这样的:

如何才能达到第二张图所示的结果?

我的styles.xml如下

<resources>
    <style name="AppTheme" parent="Theme.AppCompat.Light.NoActionBar">
        <!-- Customize your theme here. -->
        <item name="colorPrimary">@color/colorPrimary</item>
        <item name="colorPrimaryDark">@color/colorPrimaryDark</item>
        <item name="colorAccent">@color/colorAccent</item>
    </style>
</resources>

遵循以下规则:

  • 不要在 ScrollView 的 children 上使用 android:layout_gravity 属性。
    • 它会产生不需要的行为,有关详细信息,请参阅评论。
  • 不要在 ScrollView 的 children 上使用 android:layout_height="match_parent"
    • child 不想和屏幕一样大(滚动视图视口)。重点是 child 具有精确的高度或想要扩展以适合其自己的内容。
    • 虽然 match_parent 对于 children 的滚动视图可能表现为 wrap_content,但从哲学上讲,它在这里没有意义。

如果您需要让内容在整个屏幕上居中并且允许在不适合时滚动,请使用此设置:

<ScrollView
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:fillViewport="true">
    <LinearLayout
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:gravity="center_vertical"
            android:orientation="vertical">
        <!-- Etc. -->
    </LinearLayout>
</ScrollView>

android:fillViewport="true" 扩展 child 如果它小于滚动视图。

注意 android:gravity.

中缺少的 layout_ 前缀
  • android:gravity 告诉 LinearLayout 如何定位它自己的 children 在它自己里面。
  • android:layout_gravity 告诉 parent 是谁 (此处 ScrollView)如何将 LinearLayout 放置在 parent.