La valeur du rapport semi-étendu doit être définie sur une valeur comprise entre 0 et 1 exclusif , alors définissez cette valeur sur un nombre très bas qui est certain d'être inférieur à votre hauteur de vue, par exemple "0,0001f". Avec cette valeur, vous ne devriez même pas voir l' STATE_HALF_EXPANDED
état. Les états fluctueront entre STATE_EXPANDED
et STATE_COLLAPSED
.
Solution alternative
La solution ci-dessus fonctionne et désactive efficacement l' STATE_HALF_EXPANDED
état, mais elle est hackish (IMO) et peut se casser à l'avenir. Par exemple, que se passe-t-il si une valeur raisonnable pour le rapport semi-étendu qui se situe quelque part entre la hauteur de coup d'œil et la hauteur totale est appliquée? Ce serait un problème.
Les exigences énoncées par l'OP sont que la feuille inférieure doit faire la transition entre la hauteur de coup d'œil et la hauteur totale. Il n'y a pas de problème avec la hauteur de coup d'œil, mais l'OP spécifie isFitToContents = false
d'atteindre la pleine hauteur. (Je suppose que sa feuille inférieure peut être plus courte que l'espace disponible.)
Malheureusement, lorsqu'un isFitToContents == false
comportement supplémentaire "à mi-hauteur" est introduit que l'OP veut éviter et donc la question.
En plus du comportement "demi-hauteur", un autre comportement est introduit qui est le "décalage étendu". Le décalage étendu spécifie à quelle distance en bas du plein écran la feuille inférieure s'arrêtera. Une valeur de 100f
, par exemple, laissera une 100px
bordure en haut de la feuille inférieure lorsqu'elle sera entièrement développée. La valeur par défaut pour le décalage étendu est zéro.
Je ne suis au courant d'aucun comportement isFitToContents == false
introduisant autre que ceux mentionnés ci-dessus.
Donc, étant donné ces exigences, pouvons-nous façonner une feuille de fond qui se déplace entre la hauteur de coup d'œil et la pleine hauteur tout en spécifiant isFitToContents == true
évitant ainsi le problème de la "demi-hauteur"? Il n'y a aucune exigence pour un décalage étendu non nul, nous n'avons donc pas à nous en soucier.
Voici une courte application de démonstration démontrant que nous pouvons répondre à ces exigences avec la structure de feuille inférieure droite:
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 nous avons une longue feuille de fond, la structure suivante fonctionne pour la faire défiler:
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>