web-dev-qa-db-fra.com

Masquer AppBarLayout et donner de l'espace à la vue restante

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.

Problème

À 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:

Before

Après avoir caché (AppBar traduit en haut):

After

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.

17
natario

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);
18
Alberto Polo

Ce qui suit fonctionne aussi

appBarLayout.setExpanded(false, false);
appBarLayout.setVisibility(View.GONE);
1
Desmond Lua