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 entre STATE_EXPANDED
y STATE_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á un 100px
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
class MainActivity5 : BaseActivity() {
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setContentView(R.layout.activity_main5)
val bottomSheet = findViewById<LinearLayout>(R.id.bottom_sheet)
val sheetBehavior: BottomSheetBehavior<LinearLayout> = BottomSheetBehavior.from(bottomSheet)
sheetBehavior.isFitToContents = true // the default
sheetBehavior.peekHeight = 200
// Log the states the bottom sheet passes through.
sheetBehavior.addBottomSheetCallback(object : BottomSheetBehavior.BottomSheetCallback() {
override fun onStateChanged(bottomSheet: View, newState: Int) {
Log.d("MainActivity", "<<<< $newState = ${translateSheetState(newState)}")
}
override fun onSlide(bottomSheet: View, slideOffset: Float) {}
})
}
}
BaseActivity.kt
open class BaseActivity : AppCompatActivity() {
protected fun translateSheetState(state: Int): String {
return when (state) {
BottomSheetBehavior.STATE_COLLAPSED -> "STATE_COLLAPSED"
BottomSheetBehavior.STATE_DRAGGING -> "STATE_DRAGGING"
BottomSheetBehavior.STATE_EXPANDED -> "STATE_EXPANDED"
BottomSheetBehavior.STATE_HALF_EXPANDED -> "STATE_HALF_EXPANDED"
BottomSheetBehavior.STATE_HIDDEN -> "STATE_HIDDEN"
BottomSheetBehavior.STATE_SETTLING -> "STATE_SETTLING"
else -> "Unknown state: $state"
}
}
}
activity_main5.xml
<androidx.coordinatorlayout.widget.CoordinatorLayout
android:id="@+id/main_content"
android:layout_width="match_parent"
android:layout_height="match_parent">
<LinearLayout
android:id="@+id/bottom_sheet"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:background="@android:color/holo_orange_light"
android:orientation="vertical"
android:scrollbars="none"
app:layout_behavior="@string/bottom_sheet_behavior">
<TextView
android:id="@+id/tv"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:padding="16dp"
android:text="@string/short_text"
android:textSize="16sp" />
</LinearLayout>
</androidx.coordinatorlayout.widget.CoordinatorLayout>
Si tenemos una hoja inferior larga, la siguiente estructura funciona para desplazarla:
activity_main6.xml
<androidx.coordinatorlayout.widget.CoordinatorLayout
android:id="@+id/main_content"
android:layout_width="match_parent"
android:layout_height="match_parent">
<LinearLayout
android:id="@+id/bottom_sheet"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:background="@android:color/holo_orange_light"
android:orientation="vertical"
android:scrollbars="none"
app:layout_behavior="@string/bottom_sheet_behavior">
<androidx.core.widget.NestedScrollView
android:layout_width="match_parent"
android:layout_height="match_parent">
<TextView
android:id="@+id/tv"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:padding="16dp"
android:text="@string/long_text"
android:textSize="16sp" />
</androidx.core.widget.NestedScrollView>
</LinearLayout>
</androidx.coordinatorlayout.widget.CoordinatorLayout>