Установка максимальной развернутой высоты для нижнего листа динамически

Как установить максимальную развернутую высоту в нижнем листе дизайна поддержки Android?

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

Я попытался установить новые параметры макета для представления, реализующего поведение нижнего листа, но это не дает ничего хорошего.


person saurabh dhillon    schedule 17.03.2018    source источник


Ответы (3)


Самое простое решение - установить свойство maxHeight нижнего листа следующим образом.

DisplayMetrics displayMetrics = new DisplayMetrics();
        activity.getWindowManager().getDefaultDisplay().getMetrics(displayMetrics);
 bottomSheet.setMaxHeight((int) (displayMetrics.heightPixels * 0.65));
person Nidhin Rejoice    schedule 05.02.2019
comment
такого метода setMaxHeight нет. - person Wijay Sharma; 13.12.2019
comment
setMaxHeight доступен в представлении, куда вы добавляете приложение: layout_behavior = android.support.design.widget.BottomSheetBehavior - person Nidhin Rejoice; 14.12.2019
comment
этот пакет недоступен с androidX - person famfamfam; 22.06.2021

2021 Я опаздываю, но кому-то понадобится расширение Kotlin:

fun View.setupFullHeight(maxHeight: Double = 0.3) {
val displayMetrics = context?.resources?.displayMetrics
val height = displayMetrics?.heightPixels
val maximalHeight = (height?.times(maxHeight))?.toInt()
val layoutParams = this.layoutParams
maximalHeight?.let {
    layoutParams.height = it
}
this.layoutParams = layoutParams

}

Как пользоваться:

override fun onCreateDialog(savedInstanceState: Bundle?): Dialog {
    return object : BottomSheetDialog(requireContext(), R.style.DialogRoundedCornerStyle) {

        override fun onCreate(savedInstanceState: Bundle?) {
            super.onCreate(savedInstanceState)

            dialog?.setOnShowListener {
                val bottomSheetDialog = it as BottomSheetDialog
                val parentLayout =
                    bottomSheetDialog.findViewById<View>(R.id.design_bottom_sheet)
                parentLayout?.let { view ->
                    val behavior = BottomSheetBehavior.from(view)
                    view.setupFullHeight()
                    behavior.apply {
                        state = BottomSheetBehavior.STATE_EXPANDED
                        isDraggable = false
                        isCancelable = false
                    }
                }
            }
        }

        override fun onBackPressed() {
            super.onBackPressed()
            dialog?.dismiss()
        }
    }
}
person Романыч    schedule 01.07.2021

Наконец нашел,

Этот вопрос очень беспокоил меня, поскольку нигде не сообщалось о решении, и ответ кроется в самом поведении.

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

Чтобы динамически установить максимальную развернутую высоту для нижнего листа, нам нужно увеличить минимальное значение смещения с 0 до желаемого значения в классе BottomSheetBehavior, позвольте мне показать код.

Удачного кодирования !!

         // The minimum offset value upto which your bottomsheet to move
         private int mMinOffset;

        /**
          * Called when the parent CoordinatorLayout is about the layout the given child view.
          */
        @Override
        public boolean onLayoutChild(CoordinatorLayout parent, V child, int layoutDirection) {
               int dynamicHeight = Utils.dpToPx(parent.getContext(), **your_value_in_dp**);
               mMinOffset = Math.max(dynamicHeight, mParentHeight - child.getHeight());
               mMaxOffset = Math.max(mParentHeight - mPeekHeight, mMinOffset);
               mAnchorOffset = Math.min(mParentHeight - mAnchorHeight, mMaxOffset);

               if (mState == STATE_EXPANDED) {
                    ViewCompat.offsetTopAndBottom(child, mMinOffset);
                    anchorViews(mMinOffset);
               } 
        }
person saurabh dhillon    schedule 28.03.2018
comment
Непонятно, что вы намеревались сделать с этим решением. Вы расширили BottomSheetBehavior? Поскольку mMaxOffset, mParentHeight, mPeekHeight не являются общедоступными в этом классе, поэтому я не могу понять, как вы реализовали это - person ARLabs; 16.08.2018
comment
@ARLabs, Да, я расширил поведение нижнего листа и изменил значения в методе onLayoutChild (CoordinatorLayout parent, V child, int layoutDirection), предоставляемом android. - person saurabh dhillon; 07.09.2018
comment
Но вы используете закрытые члены пакета, поэтому разместили ли вы свой собственный BottomSheetBehavior в пакете android.support.design.widget? - person ARLabs; 12.09.2018
comment
@ARLabs Нет, зачем мне это делать. Я расширил свое поведение с помощью CoordinatorLayout.Behavior ‹V› и вставил все методы в поведение листа Android в свое поведение. - person saurabh dhillon; 25.09.2018
comment
Хорошо, извините ... вы не расширили BottomSheetBehaviour ... но вырезали / вставили из него. Спасибо - person ARLabs; 25.09.2018
comment
@ARLabs, да, я расширил его с помощью CoordinatorLayout.Behavior ‹V› и вставил код из стандартного поведения Android в мое новое пользовательское поведение, которое делает его компилируемым. Надеюсь, это решит вашу проблему, пожалуйста, проверьте связь, если потребуется дополнительная помощь. - person saurabh dhillon; 25.09.2018
comment
Разве это не слишком больно. Почему бы нам просто не установить максимальный размер нижней панели в соответствии с размером экрана? - person Nidhin Rejoice; 05.02.2019
comment
В последней на сегодняшний день версии (1.1.0-alpha07) Material Components Android есть параметр для этого: behavior_expandedOffset. Может использоваться в XML (но только в пикселях или в коде через BottomSheelBehavior#setExpandedOffset. Работает, если для behavior_fitToContents установлено значение false (по умолчанию установлено значение true!). Проверьте это здесь: github.com/material-components/material-components-android/ - person Mackovich; 06.06.2019
comment
@saurabhdhillon Можете ли вы просто поделиться кодом, так как я не понимаю, что вы сделали? Вы расширили класс поведением компоновки координатора и вставкой кода поведения компоновки координатора и не имеете ничего общего с поведением нижнего листа. Правильно? - person Lakshya Punhani; 27.07.2019
comment
@LakshyaPunhani, это точный код, который будет работать, вам нужно создать собственное поведение и переиграть метод, как указано выше, и заменить your_value_in_dp. - person saurabh dhillon; 25.04.2020
comment
@WijaySharma, дайте мне знать, я помогу вам с объяснением, я заставил это работать, когда не было такой функции, поэтому я просто переопределил метод частного пакета в BottomSheetBehavior, создав свое собственное поведение и явно указав максимальную высоту. - person saurabh dhillon; 25.04.2020