BottomSheetDialogFragment – Как установить увеличенную высоту (или минимальное смещение сверху)

Я создаю BottomSheetDialogFragment и я хочу настроить его максимальную расширенную высоту. Как я могу это сделать? Я могу получить BottomSheetBehaviour но все, что я могу найти, – это сеттер высоты заглядывания, но ничего для расширенной высоты.

 public class DialogMediaDetails extends BottomSheetDialogFragment { @Override public void setupDialog(Dialog dialog, int style) { super.setupDialog(dialog, style); View view = View.inflate(getContext(), R.layout.dialog_media_details, null); dialog.setContentView(view); ... View bottomSheet = dialog.findViewById(R.id.design_bottom_sheet); BottomSheetBehavior behavior = BottomSheetBehavior.from(bottomSheet); behavior.setPeekHeight(...); // how to set maximum expanded height???? Or a minimum top offset? } } 

РЕДАКТИРОВАТЬ

Зачем мне это нужно? Потому что я показываю диалог BottomSheet в полноэкранном режиме, и он выглядит плохо, если BottomSheet оставляет место сверху …

Solutions Collecting From Web of "BottomSheetDialogFragment – Как установить увеличенную высоту (или минимальное смещение сверху)"

БОЛЬШОЕ ОБНОВЛЕНИЕ Избегание дублированного кода Я даю ссылку на полный ответ, где вы можете найти все объяснения о том, как получить полное поведение, такое как Карты Google.


Я хочу настроить максимальную расширенную высоту. Как я могу это сделать?

В BottomSheet и BottomSheetDialogFragment используется метод BottomSheetBehavior, который можно найти в Support Library 23.x

Этот класс Java имеет 2 разных применения для mMinOffset , один из них используется для определения области родителя, которую он будет использовать для рисования его содержимого (возможно, NestedScrollView ). И другое использование , если для определения расширенной точки привязки, я имею в виду, если вы двигаете его форму STATE_COLLAPSED будет анимировать BottomSheet , пока он не достиг этой точки привязки , но если вы все еще можете держать скольжение вверх , чтобы покрыть всю родительскую высоту (CoordiantorLayout высота) ,

Если вы посмотрели на BottomSheetDialog вы увидите этот метод:

 private View wrapInBottomSheet(int layoutResId, View view, ViewGroup.LayoutParams params) { final CoordinatorLayout coordinator = (CoordinatorLayout) View.inflate(getContext(), android.support.design.R.layout.design_bottom_sheet_dialog, null); if (layoutResId != 0 && view == null) { view = getLayoutInflater().inflate(layoutResId, coordinator, false); } FrameLayout bottomSheet = (FrameLayout) coordinator.findViewById(android.support.design.R.id.design_bottom_sheet); BottomSheetBehavior.from(bottomSheet).setBottomSheetCallback(mBottomSheetCallback); if (params == null) { bottomSheet.addView(view); } else { bottomSheet.addView(view, params); } // We treat the CoordinatorLayout as outside the dialog though it is technically inside if (shouldWindowCloseOnTouchOutside()) { final View finalView = view; coordinator.setOnTouchListener(new View.OnTouchListener() { @Override public boolean onTouch(View v, MotionEvent event) { if (isShowing() && MotionEventCompat.getActionMasked(event) == MotionEvent.ACTION_UP && !coordinator.isPointInChildBounds(finalView, (int) event.getX(), (int) event.getY())) { cancel(); return true; } return false; } }); } return coordinator; } 

Не знаю, какое из этих двух действий вы хотите, но если вам нужно второе, выполните следующие действия:

  1. Создайте класс Java и расширьте его из CoordinatorLayout.Behavior<V>
  2. Скопируйте код вставки из файла BottomSheetBehavior умолчанию в новый.
  3. Измените метод clampViewPositionVertical следующим кодом:

    @Override public int clampViewPositionVertical (Просмотреть дочерний элемент, int top, int dy) {return constrain (top, mMinOffset, mHideable? MParentHeight: mMaxOffset); } Int constrain (int amount, int low, int high) {return amount <low? Низкий: (количество> высокий? Высокий: сумма); }

  4. Добавить новое состояние

    Public static final int STATE_ANCHOR_POINT = X;

  5. Измените следующие методы: onLayoutChild , onStopNestedScroll , BottomSheetBehavior<V> from(V view) и setState (необязательно)

И вот как это выглядит:
[ CustomBottomSheetBehavior ]

Я нашел гораздо более простой ответ; В вашем примере, где вы получаете FrameLayout для нижнего листа, используя этот код

 View bottomSheet = dialog.findViewById(R.id.design_bottom_sheet); 

Вы можете установить высоту в параметрах макета для этого представления для любой высоты, на которую вы хотите установить расширенную высоту.

 bottomSheet.getLayoutParams().height = ViewGroup.LayoutParams.MATCH_PARENT;