7

У меня есть следующая тестовая версия нижнего листа.Android BottomSheetDialogFragment полностью не расширяется

Когда я устанавливаю peehHight на значение меньше 500, он работает. После некоторого значения любое увеличение высоты зазора не изменит способ расширения нижнего листа. Он просто остается там только вручную. Как мы устанавливаем peekHeight программно, чтобы гарантировать, что нижний лист будет автоматически расширен до высоты зазора.

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 код

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); 
    } 
} 
+0

Вы понимаете, что высота заглядывания - это высота листа, которая «рушится» и просто показывает некоторые из них? Если вы установите высоту загляденья на высоту самого листа (или больше) ... тогда вся «подглядывание» бесполезно. Не могли бы вы объяснить, что * вы пытаетесь сделать? –

+0

Спасибо за это. Да, я понял, что peekHeight был настроен на свернутое представление. В любом случае, я смог исправить проблему –

+0

, эта строка сделала для меня трюк: coordinatorLayout.getLayoutParams(). Height = bottomSheetInternal.getHeight(); " – tieorange

ответ

3

При более глубокой инспекции UI, мы видим, что есть еще один CoordinatorLayout что оборачивает макет нашего координатора. Родитель CoordinatorLayout имеет FrameLayout с BottomSheetBehavior с идентификатором design_bottom_sheet. Высота заглядывать устанавливается от нашего кода выше становился сдерживается в match_parent высоты FrameLayout с идентификатором design_bottom_sheet

Установив высоту заглянуть в FrameLayout с design_bottom_sheet ид, этот вопрос был решен

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.setHidable(false); 
      BottomSheetBehavior.from((View)coordinatorLayout.getParent()).setPeekHeight(bottomSheetInternal.getHeight()); 
      bottomSheetBehavior.setPeekHeight(bottomSheetInternal.getHeight()); 
      coordinatorLayout.getParent().requestLayout(); 

     } 
    }); 
+0

Это решение дает ошибки в R.id.locUXCoordinatorLayout, не может разрешить символ. Какой R мы должны использовать здесь ..? –

+0

locUXCoordinatorLayout, это был идентификатор, который у меня был на мой взгляд. Возможно, у вас его нет в виду. См. Код, который я приложил в вопросе. Если, если решает вашу проблему, оцените, если вы отвечаете за ответ –

13

Я нашел другое решение. Может быть, для будущих читателей это может быть полезно.

@Override 
public void setupDialog(Dialog dialog, int style) { 
    super.setupDialog(dialog, style); 
    final View root = View.inflate(getContext(), R.layout.fragment_bottom_sheet_choose_time, null); 
    dialog.setContentView(root); 
    initView(root); 

    CoordinatorLayout.LayoutParams params = (CoordinatorLayout.LayoutParams) ((View) root.getParent()).getLayoutParams(); 
    CoordinatorLayout.Behavior behavior = params.getBehavior(); 

    if (behavior != null && behavior instanceof BottomSheetBehavior) { 
     mBottomSheetBehavior = (BottomSheetBehavior) behavior; 
     mBottomSheetBehavior.setBottomSheetCallback(mBottomSheetBehaviorCallback); 

     root.getViewTreeObserver().addOnGlobalLayoutListener(new ViewTreeObserver.OnGlobalLayoutListener() { 
      @Override 
      public void onGlobalLayout() { 
       root.getViewTreeObserver().removeGlobalOnLayoutListener(this); 
       int height = root.getMeasuredHeight(); 
       mBottomSheetBehavior.setPeekHeight(height); 
      } 
     }); 
    } 
} 

Как уже упоминалось @Anthonyeef, здесь ViewTreeObserver направлена, чтобы получить точную высоту измерения после того, как вид действительно измеряется и GlobalOnLayoutListener снимается для лучшей производительности.

Но, пожалуйста, перед использованием в производстве, протестируйте это решение на разных устройствах и экранах, потому что, если ваш контент в нижнем листе выше вашего экрана, он может вызвать странное поведение салфетки.

+0

Это отлично сработало для меня. Спасибо. –

+1

Добро пожаловать. –

+1

Этот ответ действительно решает мою проблему. Если может быть еще несколько объяснений, это было бы хорошо. Например, я ищу и тестирую сам, в конечном итоге выясните, что ViewTreeObserver нацелен на то, чтобы получить точную высоту измерения после того, как представление действительно измеряется, и GlobalOnLayoutListener удаляется для более высокая производительность. – Anthonyeef

7

Использование этого кода в onCreateView.

getDialog().setOnShowListener(new DialogInterface.OnShowListener() { 
     @Override 
     public void onShow(DialogInterface dialog) { 
      BottomSheetDialog d = (BottomSheetDialog) dialog; 
      FrameLayout bottomSheet = (FrameLayout) d.findViewById(R.id.design_bottom_sheet); 
      CoordinatorLayout coordinatorLayout = (CoordinatorLayout) bottomSheet.getParent(); 
      BottomSheetBehavior bottomSheetBehavior = BottomSheetBehavior.from(bottomSheet); 
      bottomSheetBehavior.setPeekHeight(bottomSheet.getHeight()); 
      coordinatorLayout.getParent().requestLayout(); 
     } 
    }); 
+0

В моем случае этот код следует вызывать в 'onActivityCreated', тогда отлично работать – acntwww

Смежные вопросы