web-dev-qa-db-fra.com

Changer dynamiquement la hauteur de BottomSheetBehavior

J'utilise la BottomSheetBehavior de Google, AppCompat v23.2, récemment publiée. La hauteur de ma feuille inférieure dépend du contenu affiché à l'intérieur de la feuille inférieure (semblable à ce que Google fait lui-même dans son application Maps).

Cela fonctionne bien avec les données chargées initialement, mais mon application modifie le contenu affiché pendant l'exécution et lorsque cela se produit, la feuille de fond conserve à son ancienne hauteur, ce qui entraîne un espace inutilisé au bas ou une coupure de vue.

Existe-t-il un moyen d'informer la disposition inférieure de la feuille pour recalculer la hauteur utilisée pour l'état développé (lorsque la hauteur de la variable ViewGroup est définie sur MATCH_HEIGHT) ou une méthode permettant de définir manuellement la hauteur requise?


EDIT: J'ai aussi essayé d'appeler manuellement invalidate() sur le ViewGroup et le parent de celui-ci, mais sans succès.

31
miho

J'ai eu le même problème avec RelativeLayout comme feuille de fond. La hauteur ne sera pas recalculée. J'ai dû recourir à la nouvelle valeur recalculée pour régler la hauteur et appeler BottomSheetBehavior.onLayoutChild.

Ceci est ma solution temporaire:

coordinatorLayout = (CoordinatorLayout)findViewById(R.id.coordinator_layout);
bottomSheet = findViewById(R.id.bottom_sheet);

int accountHeight = accountTextView.getHeight();
accountTextView.setVisibility(View.GONE);

bottomSheet.getLayoutParams().height = bottomSheet.getHeight() - accountHeight;
bottomSheet.requestLayout();
behavior.onLayoutChild(coordinatorLayout, bottomSheet, ViewCompat.LAYOUT_DIRECTION_LTR);
28
Phyrum Tea

Vous pouvez utiliser BottomSheetBehavior#setPeekHeight pour cela.

FrameLayout bottomSheet = (FrameLayout) findViewById(R.id.bottom_sheet);
BottomSheetBehavior<FrameLayout> behavior = BottomSheetBehavior.from(bottomSheet);
behavior.setPeekHeight(newHeight);

Cela ne déplace pas automatiquement la feuille inférieure à la hauteur de coup d'oeil. Vous pouvez appeler BottomSheetBehavior#setState pour ajuster votre feuille de fond à la nouvelle hauteur de coup d'oeil.

behavior.setState(BottomSheetBehavior.STATE_COLLAPSED);
8
Yuichi Araki

Bien que le problème ait été résolu dans> = 24.0.0 support library, si pour une raison quelconque vous devez toujours utiliser l'ancienne version, voici une solution de contournement. 

mBottomSheetBehavior.setBottomSheetCallback(new BottomSheetBehavior.BottomSheetCallback() {
        @Override
        public void onStateChanged(@NonNull final View bottomSheet, int newState) {
            bottomSheet.post(new Runnable() {
                @Override
                public void run() {
                    //workaround for the bottomsheet  bug
                    bottomSheet.requestLayout();
                    bottomSheet.invalidate();
                }
            });
        }

        @Override
        public void onSlide(@NonNull View bottomSheet, float slideOffset) {
        }
    });
1
Ankush Chugh

J'ai rencontré le même problème. Lors de la tentative de mise à jour de la hauteur de peek en fonction de son contenu, la hauteur d'une disposition précédente a été trouvée. Cela a du sens car la nouvelle mise en page n’a pas encore eu lieu. En publiant sur le fil de l'interface utilisateur, la hauteur de la présentation est calculée après la nouvelle présentation et une autre demande de présentation est effectuée pour mettre à jour la feuille du bas à la bonne hauteur.

void show() {
    setVisibility(View.VISIBLE);
    post(new Runnable() {
        @Override
        public void run() {
            mBottomSheetBehavior.setPeekHeight(findViewById(R.id.sheetPeek).getHeight());
            requestLayout();
        }
    })
}
0
Harald Unander

Je faisais face au même problème lorsque j'ai utilisé une vue de recyclage dans une feuille de fond et que les éléments ont changé de manière dynamique. Comme @sosite l'a mentionné dans son commentaire, le problème est enregistré et ils l'ont corrigé dans la dernière version . Issue log here

Il suffit de mettre à jour votre bibliothèque de support de conception vers la version 24.0.0 et de la vérifier.

0
hari_shankar