Ich habe ein unteres Blatt, das zwischen zwei Zuständen liegen sollte, STATE_COLLAPSED
und STATE_EXPANDED
wenn es zusammengeklappt ist, sollte die Höhe sein 200dp
und wenn es erweitert wird, wird es im Vollbildmodus angezeigt.
Also setze ich das BottomSheetBehavior
mit
isFitToContents = false
peekHeight = 200dp
und ich bin gezwungen, einen anderen Wert halfExpandedRatio
festzulegen, wenn STATE_HALF_EXPANDED
das untere Blatt die Hälfte des Bildschirms einnimmt.
Ich arbeite mit com.google.android.material:material:1.1.0-rc01
Gibt es eine Möglichkeit, den STATE_HALF_EXPANDED
Staat zu deaktivieren ?
Oder ich sollte tatsächlich festlegen skipCollapsed=true
, in Bezug auf das Verhältnis herausfinden, was 200 dp bedeutet, und mit STATE_HALF_EXPANDED
und STATE_EXPANDED
anstelle von STATE_COLLAPSED
und arbeitenSTATE_EXPANDED
quelle
halfExpandedRatio=0.25f
undpeekHeight = 200dp
anschließende BehandelnSTATE_COLLAPSED
undSTATE_HALF_EXPANDED
als ob sie sich in demselben Zustand befinden, das Problem löst. Halten Sie die Frage offen, falls es andere Ideen gibt.Antworten:
Der Wert des halb erweiterten Verhältnisses muss auf einen Wert zwischen 0 und 1 exklusiv eingestellt werden. Stellen Sie diesen Wert daher auf eine sehr niedrige Zahl ein, die mit Sicherheit unter Ihrer Blickhöhe liegt, z. B. "0,0001f". Mit diesem Wert sollten Sie nicht einmal den
STATE_HALF_EXPANDED
Status sehen. Die Zustände schwanken zwischenSTATE_EXPANDED
undSTATE_COLLAPSED
.Alternative Lösung
Die obige Lösung funktioniert und deaktiviert den
STATE_HALF_EXPANDED
Status effektiv , ist jedoch hackisch (IMO) und kann in Zukunft nicht mehr funktionieren. Was ist zum Beispiel, wenn ein angemessener Wert für das halb erweiterte Verhältnis erzwungen wird, der irgendwo zwischen der Blickhöhe und der vollen Höhe liegt? Das wäre Ärger.Die Anforderungen des OP lauten, dass das untere Blatt zwischen der Blickhöhe und der vollen Höhe wechseln muss. Es gibt kein Problem mit der Blickhöhe, aber das OP gibt an
isFitToContents = false
an, dass die volle Höhe erreicht werden soll. (Ich gehe davon aus, dass sein unteres Blatt kürzer sein kann als der verfügbare Platz.)Leider, wenn
isFitToContents == false
ein zusätzliches "halbes" Verhalten eingeführt wird, das das OP vermeiden möchte und daher die Frage.Zusätzlich zum Verhalten "halbe Höhe" wird ein anderes Verhalten eingeführt, nämlich der "erweiterte Versatz". Der erweiterte Versatz gibt an, wie weit vom unteren Bildschirm entfernt das untere Blatt angehalten wird. Ein Wert von
100f
beispielsweise hinterlässt100px
bei vollständiger Erweiterung einen Rand am oberen Rand des unteren Blattes. Der Standardwert für den erweiterten Offset ist Null.Mir sind keine Verhaltensweisen bekannt
isFitToContents == false
als die oben genannten bekannt.Können wir angesichts dieser Anforderungen ein unteres Blatt erstellen, das sich beim Festlegen zwischen der Blickhöhe und der vollen Höhe bewegt?
isFitToContents == true
wodurch das Problem der "halben Höhe" vermieden wird? Es ist kein erweiterter Offset ungleich Null erforderlich, daher müssen wir uns darüber keine Sorgen machen.Hier ist eine kurze Demo-App, die zeigt, dass wir diese Anforderungen mit der rechten unteren Blattstruktur erfüllen können:
MainActivity5.kt
BaseActivity.kt
activity_main5.xml
Wenn wir ein langes unteres Blatt haben, funktioniert die folgende Struktur, um es zu scrollen:
activity_main6.xml
quelle
isFitToContents = false
, aber das TestenisFitToContents = true
funktioniert jetzt in OrdnungsheetBehavior.state = BottomSheetBehavior.STATE_HIDDEN
wenn der halb erweiterte Zustand erreicht ist, aber das wird etwas kompliziert. Die alternative Lösung ist besser.Wenn Sie oben wie im Bild versuchen möchten, können Sie dem folgenden Code folgen, möge es Ihnen helfen !!!
quelle
Versuchen Sie, ein
addBottomSheetCallback
auf Ihrem zu setzenBottomSheetBehavior
, undSTATE_HALF_EXPANDED
rufen Sie auf , wenn Sie einen Status erkennen.setState(STATE_HIDDEN)
Wenn das untere Blatt versucht, den halben Status zu erreichen, wird es einfach geschlossen.quelle
STATE_COLLAPSED
und nichtSTATE_HIDDEN
. Aber ich habe versucht, es umzusetzen und der Übergang vonSTATE_HALF_EXPANDED
zuSTATE_COLLAPSED
fühlt sich klobig an. Der Übergang zwischen den Zuständen ist animiert, so dass Sie sehen, dass das untere Blatt anhältSTATE_HALF_EXPANDED
und sich dann zuSTATE_COLLAPSED
halfExpandedState=0.25f
b / c zu kombinieren , dann wird der Übergang zwischen Staaten nicht so offensichtlich sein. Aber ich bin mir nicht sicher, ob dies eine große Veränderung im Vergleich zu dem sein wird, was ich bereits habeIch hatte einen ähnlichen Anwendungsfall, bei dem das Layout ein Drittel der Höhe betragen musste. Ich habe folgendes versucht und es hat super funktioniert.
Ich musste diese dynamisch ändern, damit ich auf dem unteren Blatt Folgendes einstelle, aber Sie können dies auch in XML tun:
Zum Schließen habe ich meinem Fragment mit der folgenden Funktion eine Animation hinzugefügt:
Hoffe das hilft
quelle
Versuchen Sie die Einstellung
BottomSheetBehavior
.setHalfExpandedRatio(0f)
. Es gibt nicht viel anderes, was sich auswirken würdeSTATE_HALF_EXPANDED
, es sei denn, der Status wird explizit mit .setState () festgelegt . Es sollte auch möglich sein, eine benutzerdefinierte zu erstellenBehavior
, die erweitertCoordinatorLayout.Behavior<View>
und nicht vorhanden istSTATE_HALF_EXPANDED
. z.B. Alles mit CoordinatorLayout-Verhalten abfangen .quelle
Ich habe verschiedene Methoden ausprobiert, aber keine Technik hat perfekt funktioniert. Ich habe versucht, Ereignisse in abzufangen
BottomSheetBehavior.BottomSheetCallback {}
und habe angerufendismiss()
basierend auf benutzerdefinierter Logik aber es verursachte einen Ruck.Also, endlich, in meinem habe
BottomSheetDialogFragment
ich hinzugefügtbottomSheetBehavior.isDraggable = false
und dies verursachte das Ziehen des unteren Blattes durch Berühren. Und ich handhabte die Entlassung des Dialogs selbst. im leeren Bereich Dialog wird sowieso entlassen.Beachten Sie, dass das untere Blatt immer noch mit Animation erweitert wird. Das ist wirklich toll!
Spaß überschreiben onCreateDialog (savedInstanceState: Bundle?): Dialog {val dialog = super.onCreateDialog (savedInstanceState)
quelle