J'ai une feuille inférieure qui devrait aller entre 2 états, STATE_COLLAPSED
et STATE_EXPANDED
lorsqu'elle est effondrée, la hauteur doit être 200dp
et lorsqu'elle est développée, elle sera en plein écran.
Donc , je suis la mise BottomSheetBehavior
en
isFitToContents = false
peekHeight = 200dp
et je suis obligé de définir une valeur dans le halfExpandedRatio
cas contraire lorsque STATE_HALF_EXPANDED
la feuille du bas prendra la moitié de l'écran.
Je travaille avec com.google.android.material:material:1.1.0-rc01
Existe-t-il un moyen de désactiver l' STATE_HALF_EXPANDED
état?
Ou je devrais en fait définir skipCollapsed=true
, comprendre en termes de ratio ce que 200dp signifie et travailler avec STATE_HALF_EXPANDED
et STATE_EXPANDED
au lieu de STATE_COLLAPSED
etSTATE_EXPANDED
android
material-components-android
Noa Drach
la source
la source
halfExpandedRatio=0.25f
,peekHeight = 200dp
puis le traitementSTATE_COLLAPSED
etSTATE_HALF_EXPANDED
comme s'ils étaient le même état résout le problème. Garder la question ouverte au cas où il y aurait d'autres idées.Réponses:
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 entreSTATE_EXPANDED
etSTATE_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 une100px
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
BaseActivity.kt
activity_main5.xml
Si nous avons une longue feuille de fond, la structure suivante fonctionne pour la faire défiler:
activity_main6.xml
la source
isFitToContents = false
, mais les tests maintenantisFitToContents = true
fonctionnent correctementsheetBehavior.state = BottomSheetBehavior.STATE_HIDDEN
lorsque l'état semi-développé est atteint, mais cela devient un peu compliqué. La solution alternative est meilleure.si vous voulez essayer ci-dessus comme dans l'image, vous pouvez suivre le code ci-dessous, que cela vous aide !!!
la source
essayez de définir un
addBottomSheetCallback
sur votreBottomSheetBehavior
, et lorsque vous détectez unSTATE_HALF_EXPANDED
état, appelezsetState(STATE_HIDDEN)
donc chaque fois que la feuille inférieure essaie d'atteindre l'état à mi-chemin, elle se fermera.la source
STATE_COLLAPSED
et nonSTATE_HIDDEN
. Mais j'ai essayé de le mettre en œuvre et la transition deSTATE_HALF_EXPANDED
àSTATE_COLLAPSED
se sent maladroite. La transition entre les états est animée, vous voyez donc la feuille du bas s'arrêter àSTATE_HALF_EXPANDED
puis elle se déplace versSTATE_COLLAPSED
halfExpandedState=0.25f
, b / c, puis la transition entre les États ne sera pas aussi évidente. Mais, je ne suis pas sûr que ce sera un grand changement par rapport à ce que j'ai déjàJ'ai eu un cas d'utilisation similaire où la disposition devait être un tiers de la hauteur. J'ai essayé ce qui suit et cela a très bien fonctionné.
J'ai dû les modifier dynamiquement, j'ai donc défini ce qui suit sur la feuille inférieure, mais vous pouvez également le faire en xml:
Pour le rejet, j'ai ajouté une animation à mon fragment en utilisant la fonction suivante:
J'espère que cela t'aides
la source
Essayez de régler
BottomSheetBehavior
.setHalfExpandedRatio(0f)
. Il n'y a pas grand-chose d'autre qui puisse affecterSTATE_HALF_EXPANDED
, à moins de définir explicitement l'état avec .setState () . Il devrait également être possible de créer un personnaliséBehavior
, qui s'étendCoordinatorLayout.Behavior<View>
et n'a pasSTATE_HALF_EXPANDED
. par exemple. Tout intercepter avec les comportements de coordinateur .la source
J'ai essayé différentes manières, mais aucune technique ne fonctionnait parfaitement. J'ai essayé d'intercepter des événements
BottomSheetBehavior.BottomSheetCallback {}
et j'ai appelé endismiss()
fonction d'une logique personnalisée, mais cela a provoqué une secousse.Donc, enfin, dans mon
BottomSheetDialogFragment
j'ai ajoutébottomSheetBehavior.isDraggable = false
et cela a provoqué le glissement de la feuille inférieure au toucher Et, j'ai géré le rejet de la boîte de dialogue par moi-même. sur la boîte de dialogue de zone vide de toute façon être rejeté.Notez que la feuille inférieure se développe toujours avec une animation. C'est vraiment génial!
remplacer le plaisir onCreateDialog (SavedInstanceState: Bundle?): Dialogue {val dialog = super.onCreateDialog (SavedInstanceState)
la source