J'ai une mise en page assez standard utilisant les nouvelles bibliothèques de design:
<AppBarLayout>
<CollapsingToolbarLayout>
<ImageView/>
<Toolbar/>
</CollapsingToolbarLayout>
</AppBarLayout>
<Android.support.v4.widget.NestedScrollView/> <!-- content here -->
Ce que j'essaie de faire est de cacher complètement la totalité de la AppBarLayout
par programme, de supprimer temporairement la Toolbar
et sa fonctionnalité de réduction.
Alors j'appelle ça:
private void disableCollapsing() {
AppBarLayout.LayoutParams p = (AppBarLayout.LayoutParams) collapsingToolbarLayout.getLayoutParams();
p.setScrollFlags(0);
collapsingToolbarLayout.setLayoutParams(p);
}
pour désactiver le comportement de réduction (fonctionne bien), et enfin ceci:
@Override
public void hide() {
final AppBarLayout layout = (AppBarLayout) findViewById(R.id.appbar);
layout.animate().translationY(-layout.getHeight())
.setListener(new AnimatorListenerAdapter() {
@Override
public void onAnimationEnd(Animator animation) {
super.onAnimationEnd(animation);
layout.setVisibility(View.GONE);
}
}).start();
}
Je fais traduire AppBarLayout vers le haut (fonctionne correctement), et à la fin de l'animation, la visibilité est de View.GONE
.
À la fin de l'animation, peu importe si j'ai également défini la visibilité sur GONE, je ne peux pas obtenir l'espace précédemment occupé par la AppBarLayout
. Mon NestedScrollView reste confiné dans la moitié inférieure de l'écran, comme si le AppBarLayout était toujours là (ce qui n'est pas le cas). Comment puis-je le réparer?
Avant de se cacher:
Après avoir caché (AppBar traduit en haut):
Comme vous pouvez le constater, l'espace supérieur est vide et inaccessible. La vue de défilement défile dans les marges qu’elle avait auparavant, comme si le changement de visibilité n’était pas mesuré par la variable CoordinatorLayout
.
J'ai essayé d'appeler coordinator.requestLayout()
, sans succès.
J'ai également essayé de définir AppBarLayout en tant que app:anchor
pour mon NestedScrollView, mais cela ne va pas du tout - la vue défilement finit par occuper tout l'écran avant même de se cacher.
Je pensais à une Behavior
personnalisée à définir sur la vue de défilement lors de l’entrée de ce mode hidden-AppBar , mais je ne parviens pas à me lancer.
Oui, cela ressemble à un bogue, j'ai résolu ce problème pour mon application en réglant la hauteur de la barre d’application sur 0:
Android.support.design.widget.AppBarLayout appbar = (Android.support.design.widget.AppBarLayout) findViewById(R.id.appbar);
CoordinatorLayout.LayoutParams lp = (CoordinatorLayout.LayoutParams)appbar.getLayoutParams();
lp.height = 0;
appbar.setLayoutParams(lp);
Ce qui suit fonctionne aussi
appBarLayout.setExpanded(false, false);
appBarLayout.setVisibility(View.GONE);