Tengo una hoja inferior que debe ir entre 2 estados, STATE_COLLAPSED
y STATE_EXPANDED
cuando se colapsa, la altura debería ser 200dp
y cuando se expande, será a pantalla completa.
Así que estoy configurando el BottomSheetBehavior
con
isFitToContents = false
peekHeight = 200dp
y me veo obligado a establecer un valor de lo halfExpandedRatio
contrario cuando en STATE_HALF_EXPANDED
la hoja inferior ocupará la mitad de la pantalla.
Estoy trabajando w / com.google.android.material:material:1.1.0-rc01
¿Hay alguna manera de deshabilitar el STATE_HALF_EXPANDED
estado?
O debería establecer skipCollapsed=true
, averiguar en términos de proporción lo que significa 200dp y trabajar con STATE_HALF_EXPANDED
y en STATE_EXPANDED
lugar de STATE_COLLAPSED
ySTATE_EXPANDED
android
material-components-android
Noa Drach
fuente
fuente
halfExpandedRatio=0.25f
ypeekHeight = 200dp
luego el tratamientoSTATE_COLLAPSED
ySTATE_HALF_EXPANDED
como si fueran el mismo estado resuelven el problema. Mantener la pregunta abierta en caso de que haya otras ideas.Respuestas:
El valor de la relación media expandida debe establecerse en un valor entre 0 y 1 exclusivo , por lo tanto, establezca este valor en un número muy bajo que seguramente sea menor que la altura de su vista, diga "0.0001f". Con este valor, ni siquiera debería ver el
STATE_HALF_EXPANDED
estado. Los estados fluctuarán entreSTATE_EXPANDED
ySTATE_COLLAPSED
.Solución alternativa
La solución anterior funciona y deshabilita efectivamente el
STATE_HALF_EXPANDED
estado, pero es hack (IMO) y puede romperse en el futuro. Por ejemplo, ¿qué sucede si se aplica un valor razonable para la relación medio expandida que está en algún lugar entre la altura de vista y la altura completa? Eso sería un problema.Los requisitos según lo establecido por el OP es que la hoja inferior debe hacer la transición entre la altura de vista y la altura completa. No hay ningún problema con la altura de vista, pero el OP especifica
isFitToContents = false
que se llegue a la altura completa. (Supongo que su hoja inferior puede ser más corta que el espacio disponible).Desafortunadamente, cuando
isFitToContents == false
se introduce un comportamiento adicional de "media altura" que el OP quiere evitar y, por lo tanto, la pregunta.Además del comportamiento de "media altura", se introduce otro comportamiento que es el "desplazamiento expandido". El desplazamiento expandido especifica qué tan lejos de la pantalla completa se detendrá la hoja inferior. Un valor de
100f
, por ejemplo, dejará un100px
borde en la parte superior de la hoja inferior cuando esté completamente expandido. El valor predeterminado para el desplazamiento expandido es cero.No conozco ningún comportamiento que
isFitToContents == false
presente otros que no sean los mencionados anteriormente.Entonces, dados estos requisitos, ¿podemos diseñar una hoja inferior que se mueva entre la altura de la vista y la altura completa mientras especificamos
isFitToContents == true
, evitando así el problema de "media altura"? No hay requisitos para un desplazamiento expandido distinto de cero, por lo que no tenemos que preocuparnos por eso.Aquí hay una breve aplicación de demostración que demuestra que podemos cumplir estos requisitos con la estructura de hoja inferior derecha:
MainActivity5.kt
BaseActivity.kt
activity_main5.xml
Si tenemos una hoja inferior larga, la siguiente estructura funciona para desplazarla:
activity_main6.xml
fuente
isFitToContents = false
, pero las pruebas ahoraisFitToContents = true
funcionan biensheetBehavior.state = BottomSheetBehavior.STATE_HIDDEN
cuando se alcanza el estado medio expandido, pero eso se está volviendo un poco complicado. La solución alternativa es mejor.Si quieres probar arriba como en la imagen, puedes seguir el código a continuación, ¡puede que te ayude!
fuente
intente configurar un
addBottomSheetCallback
en suBottomSheetBehavior
, y cuando detecte unSTATE_HALF_EXPANDED
estado, llamesetState(STATE_HIDDEN)
para que cada vez que la hoja inferior intente alcanzar el estado intermedio, simplemente se cierre.fuente
STATE_COLLAPSED
y noSTATE_HIDDEN
. Pero intenté implementarlo y la transición deSTATE_HALF_EXPANDED
a seSTATE_COLLAPSED
siente torpe. La transición entre estados es animada, por lo que verá la hoja inferior deteniéndoseSTATE_HALF_EXPANDED
y luego se mueve aSTATE_COLLAPSED
halfExpandedState=0.25f
, b / c, entonces la transición entre estados no será tan obvia. Pero, no estoy seguro de que será un gran cambio en comparación con lo que ya tengoTuve un caso de uso similar donde el diseño tenía que ser un tercio de la altura. Intenté lo siguiente y funcionó muy bien.
Tuve que cambiarlos dinámicamente, así que configuré lo siguiente en la hoja inferior, pero también puedes hacerlo en xml:
Para descartar, agregué animación a mi fragmento usando la siguiente función:
Espero que esto ayude
fuente
Intenta configurar
BottomSheetBehavior
.setHalfExpandedRatio(0f)
. No hay mucho más que pueda afectarSTATE_HALF_EXPANDED
, a menos que establezca explícitamente el estado con .setState () . También debería ser posible crear una costumbreBehavior
, que se extiendeCoordinatorLayout.Behavior<View>
y no tieneSTATE_HALF_EXPANDED
. p.ej. Interceptar todo con CoordinatorLayout Behaviors .fuente
Intenté diferentes formas, pero ninguna técnica funcionó a la perfección. Traté de interceptar eventos
BottomSheetBehavior.BottomSheetCallback {}
y llamédismiss()
base a una lógica personalizada, pero causó un tirón.Entonces, por fin, en mi
BottomSheetDialogFragment
agreguébottomSheetBehavior.isDraggable = false
y esto causó el arrastre de la hoja inferior al tacto Y, manejé el rechazo del diálogo por mi cuenta. en el diálogo de área vacía de todos modos se descarta.Tenga en cuenta que, la hoja inferior todavía se expande con animación. ¡Eso es realmente genial!
anular diversión onCreateDialog (savedInstanceState: Bundle?): Dialog {val dialog = super.onCreateDialog (savedInstanceState)
fuente