У меня есть нижний лист, который должен проходить между двумя состояниями, STATE_COLLAPSED
а STATE_EXPANDED
когда он свернут, высота должна быть, 200dp
а в развернутом виде она будет на весь экран.
Поэтому я устанавливаю BottomSheetBehavior
с
isFitToContents = false
peekHeight = 200dp
и я вынужден установить значение в halfExpandedRatio
противном случае, когда на STATE_HALF_EXPANDED
нижнем листе займет половину экрана.
Я работаю с com.google.android.material:material:1.1.0-rc01
Есть ли способ отключить STATE_HALF_EXPANDED
состояние?
Или я должен на самом деле установить skipCollapsed=true
, выяснить с точки зрения соотношения, что означает 200dp и работать с STATE_HALF_EXPANDED
и STATE_EXPANDED
вместо STATE_COLLAPSED
иSTATE_EXPANDED
android
material-components-android
Ноа Драч
источник
источник
halfExpandedRatio=0.25f
аpeekHeight = 200dp
затем обработкаSTATE_COLLAPSED
иSTATE_HALF_EXPANDED
как будто они в одном состоянии решают проблему. Держать вопрос открытым, если есть другие идеи.Ответы:
Значение половины расширили отношение к должно быть установлено до некоторого значения между 0 и 1 эксклюзивными , поэтому установите это значение в какое - то очень низкое число, которое наверняка будут меньше , чем ваши прятки высоты, скажем , «0.0001f». С этим значением вы даже не должны видеть
STATE_HALF_EXPANDED
состояние. Состояния будут колебаться междуSTATE_EXPANDED
иSTATE_COLLAPSED
.Альтернативное решение
Приведенное выше решение работает и эффективно отключает
STATE_HALF_EXPANDED
состояние, но оно является хакерским (IMO) и может сломаться в будущем. Например, что, если будет применено разумное значение для половины расширенного отношения, которое находится где-то между высотой взгляда и полной высотой? Это было бы проблемой.Требования, изложенные в OP, заключаются в том, что нижний лист должен переходить от высоты взгляда к полной высоте. С высотой взгляда проблем нет, но OP определяет,
isFitToContents = false
как добраться до полной высоты. (Я предполагаю, что его нижний лист может быть короче, чем доступное пространство.)К сожалению, когда
isFitToContents == false
вводится дополнительное «половинное» поведение, которое ОП хочет избежать, и поэтому возникает вопрос.В дополнение к поведению "половинной высоты" вводится другое поведение, которое является "расширенным смещением". Расширенное смещение указывает, насколько далеко вниз от полноэкранного режима остановится нижний лист. Значение
100f
, например, оставит100px
границу в верхней части нижнего листа при полном раскрытии. По умолчанию расширенное смещение равно нулю.Я не знаю о каких-либо поведениях, которые
isFitToContents == false
вводят, кроме упомянутых выше.Итак, учитывая эти требования, можем ли мы сформировать нижний лист, который перемещается между высотой взгляда и полной высотой, одновременно определяя,
isFitToContents == true
таким образом, избегая проблемы «половинной высоты»? Не требуется ненулевое расширенное смещение, поэтому нам не нужно об этом беспокоиться.Вот короткое демонстрационное приложение, демонстрирующее, что мы можем удовлетворить эти требования с правой структурой нижнего листа:
MainActivity5.kt
BaseActivity.kt
activity_main5.xml
Если у нас длинный нижний лист, то для его прокрутки работает следующая структура:
activity_main6.xml
источник
isFitToContents = false
, но тестирование теперьisFitToContents = true
работает нормальноsheetBehavior.state = BottomSheetBehavior.STATE_HIDDEN
когда достигнуто наполовину расширенное состояние, но это становится немного сложнее. Альтернативное решение лучше.Если вы хотите попробовать выше, как на картинке, вы можете следовать приведенному ниже коду, может это поможет вам !!!
источник
попробуйте установить a
addBottomSheetCallback
на вашем устройствеBottomSheetBehavior
, и когда вы обнаружитеSTATE_HALF_EXPANDED
состояние, позвоните,setState(STATE_HIDDEN)
чтобы всякий раз, когда нижний лист пытался достичь состояния на полпути, он просто закрывался.источник
STATE_COLLAPSED
а неSTATE_HIDDEN
. Но я попытался осуществить это, и переход отSTATE_HALF_EXPANDED
кSTATE_COLLAPSED
ощущению неуклюже. Переход между состояниями анимирован, поэтому вы видите, что нижний лист останавливается,STATE_HALF_EXPANDED
а затем перемещается вSTATE_COLLAPSED
halfExpandedState=0.25f
, так как переход между состояниями не будет таким очевидным. Но я не уверен, что это будет большим изменением по сравнению с тем, что у меня уже естьУ меня был похожий случай использования, когда макет должен был составлять треть высоты. Я попробовал следующее, и это сработало отлично.
Мне пришлось изменить их динамически, поэтому я установил следующее на нижнем листе, но вы также можете сделать это в xml:
Для исключения я добавил анимацию к своему фрагменту, используя следующую функцию:
Надеюсь это поможет
источник
Попробуйте установить
BottomSheetBehavior
.setHalfExpandedRatio(0f)
. Существует не так много другого, что могло бы повлиятьSTATE_HALF_EXPANDED
, если явно не установить состояние с помощью .setState () . Также должна быть возможность создать кастомBehavior
, который расширяетCoordinatorLayout.Behavior<View>
и не имеетSTATE_HALF_EXPANDED
. например. Перехватывать все с помощью CoordinatorLayout Behaviors .источник
Я пробовал разные способы, но ни одна техника не работала идеально. Я пытался перехватывать события
BottomSheetBehavior.BottomSheetCallback {}
и вызывать ихdismiss()
на основе пользовательской логики, но это вызвало рывок.Итак, наконец, в моем
BottomSheetDialogFragment
я добавил,bottomSheetBehavior.isDraggable = false
и это вызвало перетаскивание нижнего листа на ощупь А, я справился с закрытием диалога самостоятельно. в любом случае диалоговое окно пусто.Обратите внимание, что нижний лист все еще расширяется с анимацией. Это действительно здорово!
переопределить веселье onCreateDialog (saveInstanceState: Bundle?): Dialog {val dialog = super.onCreateDialog (saveInstanceState)
источник