ScrollView 的顶部隐藏在状态栏后面
Top of ScrollView hidden behind status bar
我有一个 FrameLayout
,其中包含用于背景的 ImageView
和 ScrollView
中的 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.xml
的 FrameLayout
中,看起来像这样
<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.
我有一个 FrameLayout
,其中包含用于背景的 ImageView
和 ScrollView
中的 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.xml
的 FrameLayout
中,看起来像这样
<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.