Monday, June 13, 2016

Android BottomSheet set PeekHeight does not set the height correctly

Leave a Comment

I have the following test bottom sheet implementation.

When I set the peekHeight to a value less than 500, it works. After some value, any increase in peek height will not change how the bottom sheet is expanded. It Just remains there to only drag manually. How do we set the peekHeight programmatically to ensure that the bottom sheet is auto expanded to the peek height.

enter image description here

bottom_sheet_dialog_main

<?xml version="1.0" encoding="utf-8"?> <android.support.design.widget.CoordinatorLayout xmlns:android="http://schemas.android.com/apk/res/android"     xmlns:app="http://schemas.android.com/apk/res-auto"     android:id="@+id/locUXCoordinatorLayout"     android:layout_width="match_parent"     android:layout_height="wrap_content">      <LinearLayout         android:id="@+id/locUXView"         android:layout_width="match_parent"         android:layout_height="wrap_content"         android:fitsSystemWindows="true"         android:orientation="vertical"         app:behavior_hideable="false"         app:behavior_peekHeight="0dp"         app:layout_behavior="@string/bottom_sheet_behavior">          <TextView             android:layout_width="match_parent"             android:layout_height="100dp"             android:text="1 Value" />          <TextView             android:layout_width="match_parent"             android:layout_height="100dp"             android:text="2 Value" />          <TextView             android:layout_width="match_parent"             android:layout_height="100dp"             android:text="3 Value" />          <TextView             android:layout_width="match_parent"             android:layout_height="100dp"             android:text="4 Value" />          <TextView             android:layout_width="match_parent"             android:layout_height="100dp"             android:text="5 Value" />          <TextView             android:layout_width="match_parent"             android:layout_height="100dp"             android:text="6 Value" />          <TextView             android:layout_width="match_parent"             android:layout_height="100dp"             android:text="7 Value" />          <TextView             android:layout_width="match_parent"             android:layout_height="100dp"             android:text="8 Value" />          <TextView             android:layout_width="match_parent"             android:layout_height="100dp"             android:text="9 Value" />          <TextView             android:layout_width="match_parent"             android:layout_height="100dp"             android:text="First Value" />     </LinearLayout> </android.support.design.widget.CoordinatorLayout> 

Java code

public class MyBottomSheetDialogFragment extends BottomSheetDialogFragment {      private static BottomSheetBehavior bottomSheetBehavior;     private static View bottomSheetInternal;     private static MyBottomSheetDialogFragment INSTANCE;      @Nullable     @Override     public View onCreateView(LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) {         getDialog().setOnShowListener(new DialogInterface.OnShowListener() {             @Override             public void onShow(DialogInterface dialog) {                 BottomSheetDialog d = (BottomSheetDialog) dialog;                 CoordinatorLayout coordinatorLayout = (CoordinatorLayout)d.findViewById(R.id.locUXCoordinatorLayout);                 bottomSheetInternal = d.findViewById(R.id.locUXView);                 bottomSheetBehavior = BottomSheetBehavior.from(bottomSheetInternal);                 bottomSheetBehavior.setPeekHeight(bottomSheetInternal.getHeight());                 bottomSheetInternal.requestLayout();                 coordinatorLayout.getLayoutParams().height = bottomSheetInternal.getHeight();                 Toast.makeText(getActivity(), "Height is" + bottomSheetInternal.getHeight() + "  " + coordinatorLayout.getLayoutParams().height, Toast.LENGTH_LONG).show();              }         });         INSTANCE = this;         return inflater.inflate(R.layout.bottom_sheet_dialog_main, container, false);     } } 

1 Answers

Answers 1

On deeper UI inspection, we find that there is another CoordinatorLayout that warps our coordinator layout. The parent CoordinatorLayout has a FrameLayout with a BottomSheetBehaviourwith the id design_bottom_sheet. The peek height set from our code above was getting constrained due the match_parent height of the FrameLayout with the id design_bottom_sheet

By setting the peek height of the FrameLayout with the id design_bottom_sheet , this issue was resolved

    public View onCreateView(LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) {     getDialog().setOnShowListener(new DialogInterface.OnShowListener() {         @Override         public void onShow(DialogInterface dialog) {             BottomSheetDialog d = (BottomSheetDialog) dialog;             coordinatorLayout = (CoordinatorLayout) d.findViewById(R.id.locUXCoordinatorLayout);             bottomSheetInternal = d.findViewById(R.id.locUXView);             bottomSheetBehavior = BottomSheetBehavior.from(bottomSheetInternal);             bottomSheetBehavior.setHideable(false);             BottomSheetBehavior.from((View)coordinatorLayout.getParent()).setPeekHeight(bottomSheetInternal.getHeight());             bottomSheetBehavior.setPeekHeight(bottomSheetInternal.getHeight());             coordinatorLayout.getParent().requestLayout();          }     }); 
If You Enjoyed This, Take 5 Seconds To Share It

0 comments:

Post a Comment