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.
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);
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);
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) {
}
});
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();
}
})
}
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.