Android-Unterstützung BottomSheetBehavior kann nicht dynamisch sein?

8

Ich benutze Bottom Sheet von Android-Support-Bibliothek wie folgt:

XML:

%Vor%

Ich füge untergeordnete Ansichten zu LinearLayout hinzu:

%Vor%

Nachdem ich die untergeordneten Ansichten hinzugefügt habe, initialisiere ich BottomSheetBehavior und erweitere es:

%Vor%

Das funktioniert nicht. Nichts zeigt. Selbst wenn ich die LinearLayout-Höhe in XML voreinstelle, ist alles nur weiß.

Wenn ich alle untergeordneten Ansichten in LinearLayout in XML hinzufüge, funktioniert alles einwandfrei. Es funktioniert einfach nicht, wenn ich versuche, Ansichten dynamisch dynamisch hinzuzufügen.

Hat jemand ähnliche Probleme?

    
Guy 25.03.2016, 11:37
quelle

2 Antworten

1

Probleme mit dynamischem Inhalt auf BottomSheetBehavior im Zusammenhang mit der Implementierung der erweiterten Größenberechnung. BottomSheetBehavior berechnet die erweiterte Größe in der onLayoutChild-Methode. Wenn Sie jedoch den Inhalt des Blattlayouts ändern, wird der Prozess asynchron gestartet. Selbst wenn Sie RequestLayout oder etwas Ähnliches aufrufen. Die Konsequenz der Aufrufe ist also:

  1. BottomSheetBehavior hat eine alte erweiterte Größe (in Ihrem Fall denke ich, dass es null ist)
  2. Sie fügen Inhalt zu BottomSheet hinzu. Erweiterte Größe ist noch alt.
  3. Sie rufen SetState zu EXPANDED auf. BottomSheetBehavior erinnert sich noch an die alte erweiterte Größe und startet die Animation auf diese Größe. Der Status wurde in STATE_SETTLING geändert!
  4. onLayoutChild aufgerufen und BottomSheetBehavior berechnet neue erweiterte Größe. Aber Animation ist bereits in Arbeit und Status ist STATE_SETTLING, also ändert BottomSheetBehavior seine Größe nicht
  5. Animation beendet. Die Größe von BottomSheet ist alt. Der Status wurde in EXPANDED geändert, aber BottomSheetBehavior "hat vergessen", dass die erweiterte Größe während der Animation geändert wurde.

Es ist sicherlich der Bug der BottomSheetBehaviour-Implementierung.

In meinem Projekt habe ich eine solche Problemumgehung gefunden:

%Vor%

Wenn Sie also BottomSheet mit neuem Inhalt anzeigen möchten, rufen Sie ShowPanel auf. Wenn Sie BottomSheet vollständig ausblenden müssen, rufen Sie hidePanel auf (wenn Sie es in Ihrem Projekt verstecken müssen. Wenn Sie es nicht können, können Sie setVisibility aus Methoden entfernen).

Die Idee einer Problemumgehung besteht darin, den Inhalt von BottomSheet niemals zu ändern, wenn BottomSheetBehavior nicht im erweiterten Zustand ist. Wenn der Status nicht erweitert wird, ändern Sie ihn einfach in expanded, warten Sie, bis die Animation beendet ist, und ändern Sie dann den Inhalt.

    
Volchik 19.11.2017, 05:32
quelle
1

Versuchen Sie, runnable in die Nachrichtenwarteschlange der Ansicht zu stellen:

%Vor%

Oder mit retroLambda:

%Vor%     
Stas Parshin 20.06.2016 12:40
quelle