I have a BottomSheetDialogFragment
that I want to be able to show on any screen. I've spent the day trying to programmatically change the peek height of the sheet, but nothing seems to be changing it.
Here is my layout, bottom_sheet.xml
:
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout
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:orientation="vertical">
<LinearLayout
android:id="@+id/bottom_sheet"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:background="@color/white"
android:orientation="vertical"
app:behavior_hideable="true"
app:behavior_peekHeight="96dp"
app:layout_behavior="@string/bottom_sheet_behavior">
<androidx.core.widget.NestedScrollView
android:id="@+id/content"
android:layout_width="match_parent"
android:layout_height="wrap_content" />
</LinearLayout>
</LinearLayout>
You will notice I have an empty NestedScrollView
. This is because I have made my content customizable when I show the bottom sheet on different screens, so I load a custom layout into it through code.
Here is my fragment class:
public class BottomSheetFragment extends BottomSheetDialogFragment {
private LinearLayout bottomSheet;
private NestedScrollView contentView;
public BottomSheetFragment() {
}
@Override
public void onCreate(@Nullable Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
}
@Nullable
@Override
public View onCreateView(@NonNull LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) {
return inflater.inflate(R.layout.bottom_sheet, container, false);
}
@Override
public void onViewCreated(@NotNull View view, Bundle savedInstanceState) {
super.onViewCreated(view, savedInstanceState);
bottomSheet = view.findViewById(R.id.bottom_sheet);
contentView = view.findViewById(R.id.content);
}
// Set the layout of the NestedScrollView by passing a layout ID
public void setLayout(int layoutId) {
if (contentView != null) {
contentView.removeAllViews();
View view = getLayoutInflater().inflate(layoutId, contentView, false);
if (view != null) {
contentView.addView(view);
}
}
}
}
Then, where I want to show the bottom sheet, I do:
BottomSheetFragment bottomSheetFragment = new BottomSheetFragment();
bottomSheetFragment.show(getSupportFragmentManager(), bottomSheetFragment.getTag());
I want the peek height of the sheet to be 64dp from the top of the screen. How and where would I do this programmatically?
I also found that, even if I change the value of app:behavior_peekHeight="96dp"
in the layout to something like 500dp, it still doesn't change anything when I show the sheet.
There is no view element in your bottom_sheet. Thats why you dont see any change when play around with peekheight
.
Set some height to bottom_sheet to view changes. If you set the height (300) for example, you will clearly see the peek height taking effect.
For example,
<LinearLayout
app:layout_constraintLeft_toLeftOf="parent"
app:layout_constraintTop_toTopOf="parent"
android:layout_width="match_parent"
android:layout_height="300dp"
android:background="@color/colorPrimary"
android:orientation="vertical"
android:id="@+id/bottom_sheet"
app:layout_behavior="@string/bottom_sheet_behavior"
app:behavior_peekHeight="96dp"
app:behavior_hideable="true">
<androidx.core.widget.NestedScrollView
android:id="@+id/content"
android:layout_width="match_parent"
android:layout_height="wrap_content" />
</LinearLayout>
will Result in
To set peekheight programatically
First you have to put your bottomsheet in coordinate layout like that
<androidx.coordinatorlayout.widget.CoordinatorLayout
android:layout_width="match_parent"
android:layout_height="wrap_content">
<LinearLayout
app:layout_constraintLeft_toLeftOf="parent"
app:layout_constraintTop_toTopOf="parent"
android:layout_width="match_parent"
android:layout_height="300dp"
android:background="@color/colorPrimary"
android:orientation="vertical"
android:id="@+id/bottom_sheet"
app:layout_behavior="@string/bottom_sheet_behavior"
app:behavior_peekHeight="96dp"
app:behavior_hideable="true">
<androidx.core.widget.NestedScrollView
android:id="@+id/content"
android:layout_width="match_parent"
android:layout_height="wrap_content" />
</LinearLayout>
</androidx.coordinatorlayout.widget.CoordinatorLayout>
In your class, you do that.
@Override
public void onViewCreated(final View view, @Nullable Bundle savedInstanceState) {
super.onViewCreated(view, savedInstanceState);
View bottomSheet = view.findViewById(R.id.bottom_sheet);
BottomSheetBehavior behavior = BottomSheetBehavior.from(bottomSheet);
behavior.setPeekHeight(150);
}
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With