Ich versuche, Bottom Sheet in einer meiner Aktivitäten zu implementieren, und ich bin irgendwie verwirrt durch die Art, wie es sich benimmt!
Also hier ist das Problem, ich habe eine Aktivität, in der ich versuche, Bottom-Blatt zu zeigen, und ich sehe das:
Wenn wir die Eigenschaft app:behavior_peekHeight
nicht setzen, funktioniert das untere Blatt nie
Wenn Sie die PeekHeight auf etwas unter 30dp setzen (im Grunde nur, um sie vor dem Bildschirm zu verbergen)
app:behavior_peekHeight
auf mehr als 30dp in der Layoutdatei setzen und versuchen, den Status von bottomSheetBehavior
auf STATE_HIDDEN
in Ihrer OnCreate-Methode festzulegen, stürzt Ihre App mit diesem Fehler ab verursacht durch:
%Vor% Ich bin wirklich verwirrt darüber, warum es mir nicht erlaubt ist, es in onCreate zu verstecken? oder warum können wir peekHeight nicht auf 0 setzen, so dass es auf dem Bildschirm nicht sichtbar ist, wenn wir nicht die STATE_EXPANDED
aufrufen oder gar nicht, dass diese Eigenschaft standardmäßig ausgeblendet werden soll! oder zumindest sollte ich in der Lage sein, es in meinem onCreate versteckt zu setzen!
Vermisse ich etwas? Oder ist das Verhalten der BottomSheet starr?
Meine Layoutdatei für das BottomSheet ist ungefähr so:
%Vor%In meiner Tätigkeit mache ich so etwas:
%Vor%In meinem Onclick mache ich das:
%Vor%Nachdem ich einige Tage an diesem Problem gearbeitet habe, habe ich eine alternative Lösung gefunden:
Anstatt das Bottom_sheet direkt in Ihrem Layout zu verwenden, wird dieses Problem nicht auftreten, wenn wir ein Bottom_Sheet-Fragment erstellen und es dann in der Aktivität instanziieren. Das untere Blatt wird ausgeblendet, und wir müssen peek_height nicht angeben
hier ist was ich gemacht habe
%Vor%Dann in meiner Tätigkeit
%Vor%Das hat mein Problem gelöst, dass das untere Blatt nicht versteckt ist, wenn die Aktivität startet, aber ich bin immer noch nicht in der Lage zu verstehen, warum, wenn bottom_sheet direkt eingeschlossen ist, wir dieses Problem haben!
Der Grund für den Absturz liegt in der Tatsache, dass die schwache Referenz erst in einer der letzten Zeilen in onLayoutChild gesetzt wird, die Ihnen die Ausnahme null ptr gibt.
Sie können ein benutzerdefiniertes BottomSheet-Verhalten erstellen und onLayoutChild überschreiben, indem Sie dort den erweiterten Status festlegen.
Ein Beispiel finden Sie hier: NullPointerExeption mit AppCompat BottomSheets
(Bezug nehmend auf die Frage) Das Problem mit Ihrem Code besteht darin, dass Sie versuchen, die setState-Methode direkt in onCreate aufzurufen. Dies wird einen NullPointer werfen, da die WeakReference noch nicht initialisiert ist. Es wird initialisiert, wenn das Coordinator-Layout seine Kindansicht legt.
onLayoutChild (CoordinatorLayout übergeordnet, V untergeordnet, int layoutDirection)
Wird aufgerufen, wenn das übergeordnete CoordinatorLayout über das Layout verfügt gegebene Kindansicht.
Der beste Ansatz ist also, die Peek-Höhe auf 0 zu setzen und innerhalb des onItemClick-Listeners ein- / auszublenden. Hier ist mein Code:
bottom_sheet.xml
%Vor%
activity_main.xml
%Vor%
MainActivity.java
%Vor%Hier ist zunächst das untere Blatt nicht sichtbar. Beim Klicken auf den Button wird der Status STATE_COLLAPSED / STATE_EXPANDED gesetzt.
Das Tutorial, dem ich gefolgt bin, um diese Demo-App zu erstellen, ist unten aufgeführt: Bottom Sheet mit Android Design Unterstützungsbibliothek
Um die Null-Zeiger-Ausnahme zu vermeiden, setzen Sie den Zustand in onCreate () auf
%Vor%Tags und Links android android-support-library bottom-sheet