使用 NestedScrollView 的持久 BottomSheet,它包含顶部填充?支持库 24.2.1
Persistent BottomSheet using NestedScrollView, it contains top padding? support-lib 24.2.1
有很多很好的教程讨论 BottomSheet 使用 NestedScrollView
。但是在我用我当前的支持库版本 24.2.1 尝试它之后,我花了几天时间不知道为什么我的包含顶部填充。
这是我的 Activity 布局 xml:
<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:layout_width="match_parent"
android:layout_height="match_parent"
android:fitsSystemWindows="true"
tools:context=".ui.MainActivity">
<!-- AppBar -->
<include
android:id="@+id/appBar"
layout="@layout/app_bar_layout_with_tab"
android:layout_width="match_parent"
android:layout_height="wrap_content"
app:tabPager="@{tabPager}" />
<!-- Content -->
<android.support.v4.widget.SwipeRefreshLayout
android:id="@+id/swipeRefresh"
android:layout_width="match_parent"
android:layout_height="match_parent"
app:layout_behavior="@string/appbar_scrolling_view_behavior">
<FrameLayout
android:id="@+id/container"
android:layout_width="match_parent"
android:layout_height="match_parent" />
</android.support.v4.widget.SwipeRefreshLayout>
<!-- [START] BottomSheet -->
<include
android:id="@+id/bottomSheetMain"
layout="@layout/fragment_bottom_sheet_song"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:fitsSystemWindows="true"
app:behavior_hideable="false"
app:behavior_peekHeight="0dp"
app:layout_behavior="@string/bottom_sheet_behavior" />
<!-- [END BottomSheet] -->
</android.support.design.widget.CoordinatorLayout>
以及 BottomSheet 的布局 fragment_bottom_sheet_song.xml
:
<android.support.v4.widget.NestedScrollView xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:background="@color/bgBottomSheetPlayer">
<LinearLayout
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:orientation="vertical">
<include
android:id="@+id/bottomSheetPlayer"
layout="@layout/view_bottom_sheet_player_dark"
android:layout_width="match_parent"
android:layout_height="wrap_content"
app:playAction="@{playAction}"
app:playObject="@{playSong}" />
<include
android:id="@+id/bottomSheetContent"
layout="@layout/view_action_detail_song"
android:layout_width="match_parent"
android:layout_height="wrap_content"
app:playSong="@{playSong}"
app:songActionHandler="@{songActionHandler}" />
</LinearLayout>
</android.support.v4.widget.NestedScrollView>
那么结果是这样的:
为什么有顶部填充?我该如何解决这个问题?
谢谢。
经过几天的尝试,我发现要解决这个问题,持久底部 sheet 布局容器必须是 FrameLayout
。如果不是(就像我的情况,我直接包含 NestedScrollView
并使其成为底部 sheet),它将包含默认的顶部填充,我仍然不知道为什么。
所以这是我要修复的新 Activity 的 xml 布局代码:
<!-- [START] BottomSheet -->
<FrameLayout
android:id="@+id/bottomSheetParent"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:fitsSystemWindows="true"
app:behavior_hideable="false"
app:behavior_peekHeight="0dp"
app:layout_behavior="@string/bottom_sheet_behavior">
<include
android:id="@+id/bottomSheetMain"
layout="@layout/fragment_bottom_sheet_song"
android:layout_width="match_parent"
android:layout_height="wrap_content" />
</FrameLayout>
<!-- [END BottomSheet] -->
希望这对你也有帮助。
尝试将此添加到您的 Activity 清单中,显然在我的情况下是键盘导致 bottomsheet 自动提供填充。
android:windowSoftInputMode="adjustPan"
我认为您需要从此视图的根布局 android.support.design.widget.CoordinatorLayout
中删除标签 android:fitsSystemWindows="true"
。您的源代码布局将是这样的。
<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:layout_width="match_parent"
android:layout_height="match_parent"
tools:context=".ui.MainActivity">
<!-- children contents -->
</android.support.design.widget.CoordinatorLayout>
希望对您有所帮助。
有很多很好的教程讨论 BottomSheet 使用 NestedScrollView
。但是在我用我当前的支持库版本 24.2.1 尝试它之后,我花了几天时间不知道为什么我的包含顶部填充。
这是我的 Activity 布局 xml:
<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:layout_width="match_parent"
android:layout_height="match_parent"
android:fitsSystemWindows="true"
tools:context=".ui.MainActivity">
<!-- AppBar -->
<include
android:id="@+id/appBar"
layout="@layout/app_bar_layout_with_tab"
android:layout_width="match_parent"
android:layout_height="wrap_content"
app:tabPager="@{tabPager}" />
<!-- Content -->
<android.support.v4.widget.SwipeRefreshLayout
android:id="@+id/swipeRefresh"
android:layout_width="match_parent"
android:layout_height="match_parent"
app:layout_behavior="@string/appbar_scrolling_view_behavior">
<FrameLayout
android:id="@+id/container"
android:layout_width="match_parent"
android:layout_height="match_parent" />
</android.support.v4.widget.SwipeRefreshLayout>
<!-- [START] BottomSheet -->
<include
android:id="@+id/bottomSheetMain"
layout="@layout/fragment_bottom_sheet_song"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:fitsSystemWindows="true"
app:behavior_hideable="false"
app:behavior_peekHeight="0dp"
app:layout_behavior="@string/bottom_sheet_behavior" />
<!-- [END BottomSheet] -->
</android.support.design.widget.CoordinatorLayout>
以及 BottomSheet 的布局 fragment_bottom_sheet_song.xml
:
<android.support.v4.widget.NestedScrollView xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:background="@color/bgBottomSheetPlayer">
<LinearLayout
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:orientation="vertical">
<include
android:id="@+id/bottomSheetPlayer"
layout="@layout/view_bottom_sheet_player_dark"
android:layout_width="match_parent"
android:layout_height="wrap_content"
app:playAction="@{playAction}"
app:playObject="@{playSong}" />
<include
android:id="@+id/bottomSheetContent"
layout="@layout/view_action_detail_song"
android:layout_width="match_parent"
android:layout_height="wrap_content"
app:playSong="@{playSong}"
app:songActionHandler="@{songActionHandler}" />
</LinearLayout>
</android.support.v4.widget.NestedScrollView>
那么结果是这样的:
为什么有顶部填充?我该如何解决这个问题?
谢谢。
经过几天的尝试,我发现要解决这个问题,持久底部 sheet 布局容器必须是 FrameLayout
。如果不是(就像我的情况,我直接包含 NestedScrollView
并使其成为底部 sheet),它将包含默认的顶部填充,我仍然不知道为什么。
所以这是我要修复的新 Activity 的 xml 布局代码:
<!-- [START] BottomSheet -->
<FrameLayout
android:id="@+id/bottomSheetParent"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:fitsSystemWindows="true"
app:behavior_hideable="false"
app:behavior_peekHeight="0dp"
app:layout_behavior="@string/bottom_sheet_behavior">
<include
android:id="@+id/bottomSheetMain"
layout="@layout/fragment_bottom_sheet_song"
android:layout_width="match_parent"
android:layout_height="wrap_content" />
</FrameLayout>
<!-- [END BottomSheet] -->
希望这对你也有帮助。
尝试将此添加到您的 Activity 清单中,显然在我的情况下是键盘导致 bottomsheet 自动提供填充。
android:windowSoftInputMode="adjustPan"
我认为您需要从此视图的根布局 android.support.design.widget.CoordinatorLayout
中删除标签 android:fitsSystemWindows="true"
。您的源代码布局将是这样的。
<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:layout_width="match_parent"
android:layout_height="match_parent"
tools:context=".ui.MainActivity">
<!-- children contents -->
</android.support.design.widget.CoordinatorLayout>
希望对您有所帮助。