You can achieve a Persistent Bottom Sheet attaching a [BottomSheetBehavior](<https://developer.android.com/reference/android/support/design/widget/BottomSheetBehavior.html>)
to a child View of a [CoordinatorLayout](<https://developer.android.com/reference/android/support/design/widget/CoordinatorLayout.html>)
:
<android.support.design.widget.CoordinatorLayout >
<!-- ..... -->
<LinearLayout
android:id="@+id/bottom_sheet"
android:elevation="4dp"
android:minHeight="120dp"
app:behavior_peekHeight="120dp"
...
app:layout_behavior="android.support.design.widget.BottomSheetBehavior">
<!-- ..... -->
</LinearLayout>
</android.support.design.widget.CoordinatorLayout>
Then in your code you can create a reference using:
// The View with the BottomSheetBehavior
View bottomSheet = coordinatorLayout.findViewById(R.id.bottom_sheet);
BottomSheetBehavior mBottomSheetBehavior = BottomSheetBehavior.from(bottomSheet);
You can set the state of your BottomSheetBehavior using the setState() method:
mBottomSheetBehavior.setState(BottomSheetBehavior.STATE_EXPANDED);
You can use one of these states:
[STATE_COLLAPSED](<https://developer.android.com/reference/android/support/design/widget/BottomSheetBehavior.html#STATE_COLLAPSED>)
: this collapsed state is the default and shows just a portion of the layout along the bottom. The height can be controlled with the app:behavior_peekHeight
attribute (defaults to 0)[STATE_EXPANDED](<https://developer.android.com/reference/android/support/design/widget/BottomSheetBehavior.html#STATE_EXPANDED>)
: the fully expanded state of the bottom sheet, where either the whole bottom sheet is visible (if its height is less than the containing CoordinatorLayout
) or the entire CoordinatorLayout
is filled[STATE_HIDDEN](<https://developer.android.com/reference/android/support/design/widget/BottomSheetBehavior.html#STATE_HIDDEN>)
: disabled by default (and enabled with the app:behavior_hideable
attribute), enabling this allows users to swipe down on the bottom sheet to completely hide the bottom sheetIf you’d like to receive callbacks of state changes, you can add a BottomSheetCallback
:
mBottomSheetBehavior.setBottomSheetCallback(new BottomSheetCallback() {
@Override
public void onStateChanged(@NonNull View bottomSheet, int newState) {
// React to state change
}
@Override
public void onSlide(@NonNull View bottomSheet, float slideOffset) {
// React to dragging events
}
});