Mam dolny arkusz, który powinien przechodzić między 2 stanami, STATE_COLLAPSED
a STATE_EXPANDED
kiedy jest zwinięty, wysokość powinna być, 200dp
a po rozwinięciu będzie pełny ekran.
Więc ja ustawienie BottomSheetBehavior
z
isFitToContents = false
peekHeight = 200dp
i jestem zmuszony ustawić inną wartość, halfExpandedRatio
gdy na STATE_HALF_EXPANDED
dolnym arkuszu zajmie połowę ekranu.
Pracuję w / com.google.android.material:material:1.1.0-rc01
Czy istnieje sposób na wyłączenie STATE_HALF_EXPANDED
stanu?
Albo powinienem właściwie ustawić skipCollapsed=true
, dowiedzieć się, co to znaczy 200dp, i pracować z STATE_HALF_EXPANDED
i STATE_EXPANDED
zamiast STATE_COLLAPSED
iSTATE_EXPANDED
android
material-components-android
Noa Drach
źródło
źródło
halfExpandedRatio=0.25f
apeekHeight = 200dp
następnie traktowanieSTATE_COLLAPSED
iSTATE_HALF_EXPANDED
jakby były w tym samym stanie rozwiązuje problem. Pozostawienie pytania otwartego na wypadek, gdyby pojawiły się inne pomysły.Odpowiedzi:
Wartość pół rozwiniętego współczynnika musi być ustawiona na pewną wartość między 0 a 1 wyłączną , więc ustaw tę wartość na bardzo małą liczbę, która z pewnością będzie mniejsza niż wysokość podglądu, powiedz „0.0001f”. Przy tej wartości nie powinieneś nawet widzieć
STATE_HALF_EXPANDED
stanu. Stany będą się zmieniać międzySTATE_EXPANDED
iSTATE_COLLAPSED
.Alternatywne rozwiązanie
Powyższe rozwiązanie działa i skutecznie wyłącza
STATE_HALF_EXPANDED
stan, ale jest hackerskie (IMO) i może się złamać w przyszłości. Na przykład co się stanie, jeśli zostanie wymuszona rozsądna wartość dla połowy rozszerzonego stosunku, który jest gdzieś pomiędzy wysokością podglądu a pełną wysokością? To byłby problem.Wymagania określone w PO są następujące: dolny arkusz powinien przechodzić między wysokością podglądu a pełną wysokością. Nie ma problemu z wysokością podglądu, ale OP określa,
isFitToContents = false
aby dostać się na pełną wysokość. (Zakładam, że jego dolny arkusz może być krótszy niż dostępne miejsce).Niestety, gdy
isFitToContents == false
wprowadza się dodatkowe zachowanie „na pół wysokości”, którego PO chce uniknąć, a zatem pytanie.Oprócz zachowania „połowy wysokości” wprowadza się inne zachowanie, które jest „rozszerzonym przesunięciem”. Rozszerzone przesunięcie określa, jak daleko od pełnego ekranu zatrzyma się dolny arkusz. Na przykład wartość
100f
,100px
po pełnym rozwinięciu , pozostawi ramkę na górze dolnego arkusza. Wartość domyślna dla rozszerzonego przesunięcia wynosi zero.Nie jestem świadomy żadnych zachowań, które
isFitToContents == false
wprowadzają inne niż wymienione powyżej.Zatem biorąc pod uwagę te wymagania, czy możemy zaprojektować dolny arkusz, który porusza się między wysokością rzutu a pełną wysokością, jednocześnie określając w
isFitToContents == true
ten sposób uniknięcie problemu „połowy wysokości”? Nie ma wymagania dla niezerowego rozszerzonego przesunięcia, więc nie musimy się tym martwić.Oto krótka aplikacja demonstracyjna pokazująca, że możemy spełnić te wymagania dzięki odpowiedniej strukturze dolnego arkusza:
MainActivity5.kt
BaseActivity.kt
activity_main5.xml
Jeśli mamy długi dolny arkusz, wówczas do przewijania działa następująca struktura:
activity_main6.xml
źródło
isFitToContents = false
, ale teraz testowanieisFitToContents = true
działa / działa dobrzesheetBehavior.state = BottomSheetBehavior.STATE_HIDDEN
gdy zostanie osiągnięty stan połowy rozwiniętej, ale to staje się trochę skomplikowane. Alternatywne rozwiązanie jest lepsze.jeśli chcesz spróbować powyżej jak na obrazku, możesz wykonać poniższy kod, niech ci to pomoże !!!
źródło
spróbuj ustawić
addBottomSheetCallback
na swoimBottomSheetBehavior
, a kiedy wykryjeszSTATE_HALF_EXPANDED
stan, zadzwoń,setState(STATE_HIDDEN)
więc za każdym razem, gdy dolny arkusz próbuje osiągnąć stan w połowie, po prostu się zamknie.źródło
STATE_COLLAPSED
i nieSTATE_HIDDEN
. Ale starałem się go i przejście od wdrożeniaSTATE_HALF_EXPANDED
doSTATE_COLLAPSED
czuje się niezgrabne. Przejście między stanami jest animowane, więc widać, że dolny arkusz zatrzymuje się,STATE_HALF_EXPANDED
a następnie przesuwa się doSTATE_COLLAPSED
halfExpandedState=0.25f
, b / c, wtedy przejście między stanami nie będzie tak oczywiste. Ale nie jestem pewien, czy będzie to duża zmiana w porównaniu z tym, co już mamMiałem podobny przypadek użycia, w którym układ musiał wynosić jedną trzecią wysokości. Próbowałem następujących i działało świetnie.
Musiałem to zmienić dynamicznie, więc ustawiłem poniższe w dolnym arkuszu, ale możesz to również zrobić w xml:
W celu odrzucenia dodałem animację do mojego fragmentu za pomocą następującej funkcji:
Mam nadzieję że to pomoże
źródło
Spróbuj ustawić
BottomSheetBehavior
.setHalfExpandedRatio(0f)
. Nie ma wiele innych rzeczy, które mogłyby mieć wpływSTATE_HALF_EXPANDED
, chyba że jawnie ustawisz stan za pomocą .setState () . Powinno być również możliwe utworzenie niestandardowegoBehavior
, który rozszerza sięCoordinatorLayout.Behavior<View>
i nie ma goSTATE_HALF_EXPANDED
. na przykład. Przechwytywanie wszystkiego za pomocą zachowań CoordinatorLayout .źródło
Próbowałem na różne sposoby, ale żadna technika nie działała idealnie. Próbowałem przechwytywać zdarzenia
BottomSheetBehavior.BottomSheetCallback {}
i wywoływać jedismiss()
na podstawie niestandardowej logiki, ale spowodowało to szarpnięcie.Nareszcie
BottomSheetDialogFragment
dodałem,bottomSheetBehavior.isDraggable = false
a to spowodowało Przeciągnięcie dolnej kartki przez dotyk I sam poradziłem sobie z zamknięciem okna dialogowego. w oknie dialogowym pustego obszaru i tak zostaną odrzucone.Pamiętaj, że dolny arkusz nadal się rozwija z animacją. To naprawdę świetne!
przesłonić zabawę onCreateDialog (saveInstanceState: Bundle?): Dialog {val dialog = super.onCreateDialog (saveInstanceState)
źródło