Afficher le titre CollapsingToolbarLayout uniquement lorsqu'il est réduit


145

J'ai essayé setExpandedTitleColoret setCollapsedTitleColor(passer de transparent) sans succès. Je ne vois pas non plus de méthodes intégrées qui feront ce que je recherche.

Je ne veux afficher le titre que lorsque le CollapsingToolbarLayout est complètement réduit, sinon, j'en ai besoin caché.

Des indices?

Réponses:


285

Vous pouvez ajouter OnOffsetChangedListenerà AppBarLayoutpour déterminer quand CollapsingToolbarLayoutest réduit ou développé et définir son titre.

Java

final CollapsingToolbarLayout collapsingToolbarLayout = (CollapsingToolbarLayout) findViewById(R.id.collapsingToolbarLayout);
AppBarLayout appBarLayout = (AppBarLayout) findViewById(R.id.appBarLayout);
appBarLayout.addOnOffsetChangedListener(new AppBarLayout.OnOffsetChangedListener() {
    boolean isShow = true;
    int scrollRange = -1;

    @Override
    public void onOffsetChanged(AppBarLayout appBarLayout, int verticalOffset) {
        if (scrollRange == -1) {
            scrollRange = appBarLayout.getTotalScrollRange();
        }
        if (scrollRange + verticalOffset == 0) {
            collapsingToolbarLayout.setTitle("Title");
            isShow = true;
        } else if(isShow) {
            collapsingToolbarLayout.setTitle(" ");//careful there should a space between double quote otherwise it wont work 
            isShow = false;
        }
    }
});

Kotlin

var isShow = true
var scrollRange = -1
appBarLayout.addOnOffsetChangedListener(AppBarLayout.OnOffsetChangedListener { barLayout, verticalOffset ->
    if (scrollRange == -1){
        scrollRange = barLayout?.totalScrollRange!!
    }
    if (scrollRange + verticalOffset == 0){
        collapsingToolbarLayout.title = "Title Collapse"
        isShow = true
    } else if (isShow){
        collapsingToolbarLayout.title = " " //careful there should a space between double quote otherwise it wont work
        isShow = false
    }
})

1
Cette solution fonctionne pour les API 23 et supérieures. C'est la solution la plus correcte.
Simon

Veuillez marquer ceci comme la bonne réponse. La réponse de @dlohani qui est actuellement marquée comme correcte ne masque pas le texte car vous pouvez le voir passer.
themichaelscott

9
Cela a fonctionné pour moi, mais a dû changer "boolean isShow = false" en true pour supprimer le nom de l'application dans la barre d'outils développée au début de l'activité.
DH28

3
@Giuseppe: c'est pareil. Testé sur l'API 16 -> fonctionne
luckyhandler

1
Cela n'a pas fonctionné pour moi, parfois le titre n'apparaît pas du tout même lorsque mes journaux indiquent clairement que setTitle a été appelé avec "Title"
user1354603

47

J'ai essayé la solution de dlohani, mais je n'ai pas aimé à cause de la décoloration. Avec cette solution, vous supprimez complètement la décoloration.

L'astuce consiste à créer un nouveau style avec textSize égal à 0,1sp ou 0sp (celui-ci plante sur SDK <19) et textColor transparent:

Pour SDK <19

<style name="CollapsingToolbarLayoutExpandedTextStyle" parent="AppTheme">
    <item name="android:textColor">@android:color/transparent</item>
    <item name="android:textSize">0.1sp</item>
</style>

Pour SDK> = 19

<style name="CollapsingToolbarLayoutExpandedTextStyle" parent="AppTheme">
    <item name="android:textColor">@android:color/transparent</item>
    <item name="android:textSize">0sp</item>
</style>

Appliquez-le ensuite au CollapsingToolbarLayout dans votre mise en page:

    <android.support.design.widget.CollapsingToolbarLayout
        android:id="@+id/collapsing_toolbar"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        app:expandedTitleTextAppearance="@style/CollapsingToolbarLayoutExpandedTextStyle"
        app:layout_scrollFlags="scroll|exitUntilCollapsed">

Ok, comme toujours, c'est une autre solution qui ne fonctionne pas de la même manière pour tous les appareils. Sur Kitkat, 0sp semble fonctionner, mais sur Jellybean, l'application plante. 0.1sp fonctionne sur Jellybean mais rend le texte instable sur Kitkat :(
Rúben Sousa

Comment pouvons-nous définir cette limite de niveau d'API sur le style?
Mahm00d

Vous devez utiliser le dossier values-v19 pour SDK> = 19 et le dossier values ​​pour SDK <19. Jetez un œil à ceci pour une référence: stackoverflow.com/questions/16624317/…
Rúben Sousa

1
Cela fonctionne sur N alors que la solution de @dlohani ne l'a pas fait
Tyler Pfaff

1
C'est la solution la plus simple et la meilleure. Merci beaucoup.
Vikash Parajuli

38

J'ai pu obtenir l'effet souhaité en ajoutant la propriété suivante à la mise en page xml:

app:expandedTitleTextAppearance="@android:color/transparent"

donc mon CollapsingToolbarLayout ressemble à ceci

<android.support.design.widget.CollapsingToolbarLayout
        android:id="@+id/collapsingToolbarLayout"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        app:expandedTitleTextAppearance="@android:color/transparent"
        app:layout_scrollFlags="scroll|exitUntilCollapsed">

c'est génial :) y a-t-il quelque chose pour que le titre propose une animation?
Lubos Mudrak

7
C'est horrible, vous le voyez disparaître à mesure qu'il s'effondre. Au contraire, il s'estompe dans sa position finale.
CaptRisky

1
Idem ce qu'a dit CaptRisky. Malheureusement, je ne pense pas qu'il y ait d'alternative :-(
kenyee

9
Cela ne fonctionnera que si vous utilisez l'API Android 22 ou une version antérieure. Pour 23 ou plus, la solution ne fonctionne pas. Vous devrez utiliser la solution de @ steven274.
Simon

1
Cela fonctionne encore mieux sur l'API Android 23 lorsque j'ai essayé
dlohani

24

J'ai une réponse plus simple:

final CollapsingToolbarLayout collapsingToolbarLayout = (CollapsingToolbarLayout) findViewById(R.id.toolbar_layout);

collapsingToolbarLayout.setTitle("Your Title");
collapsingToolbarLayout.setExpandedTitleColor(getResources().getColor(R.color.transperent)); // transperent color = #00000000
collapsingToolbarLayout.setCollapsedTitleTextColor(Color.rgb(0, 0, 0)); //Color of your title

Bon codage!


4
Cela provoque le même problème de fondu comme indiqué dans d'autres réponses.
themichaelscott

Je voulais seulement changer la couleur du titre de la barre d'outils et cela a fonctionné pour moi avecmCollapsingToolbarLayout.setExpandedTitleColor(Color.argb(255,0,0,0))
kosiara - Bartosz Kosarzycki

@Bartosz Kosarzycki, je n'ai pas eu de chance avec mCollapsingToolbarLayout.setExpandedTitleColor (Color.argb (255,0,0,0)); but mCollapsingToolbarLayout.setExpandedTitleColor (context.getResources (). getColor (android.R.color.transparent)); fait le travail, mais découle certainement de votre solution :)
ShayHaned

24

Ce code fonctionne pour moi: utilisez color.parse color car si votre couleur d'arrière-plan est différente, remplacez-la par du blanc et votre titre ne s'affiche pas

collapsingToolbarLayout.setExpandedTitleColor(Color.parseColor("#00FFFFFF"));

Ou vous pouvez utiliser pour transparent collapsingToolbarLayout.setExpandedTitleColor(Color.TRANSPARENT);


Aucun auditeur supplémentaire ne fonctionne comme prévu!
Mrityunjay Kumar le

19

J'ai ajouté avec succès une vue de texte en fondu, ajoutez simplement une vue de texte dans la barre d'outils et définissez son alpha en fonction du rappel verticalOffset dans la barre d'applications

mAppBarLayout.addOnOffsetChangedListener(new AppBarLayout.OnOffsetChangedListener() {

        @Override
        public void onOffsetChanged(AppBarLayout appBarLayout, int verticalOffset) {

            mTitleTextView.setAlpha(Math.abs(verticalOffset / (float)
                    appBarLayout.getTotalScrollRange()));
        }
    });

float range = appBarLayout.getTotalScrollRange (); float alpha = Math.abs (verticalOffset / range); if (alpha> 0,8) {mToolbar.setAlpha (alpha); } else {mToolbar.setAlpha (.0f); }
qinmiao

13

Voici la solution la plus simple et la plus fonctionnelle également avec l'API 23:

app: ExpandTitleTextAppearance doit hériter de TextAppearance.

Donc, dans votre styles.xml, ajoutez ces lignes:

<style name="TransparentText" parent="@android:style/TextAppearance">
   <item name="android:textColor">#00000000</item>
</style>

Ensuite, dans votre CollapsingToolbarLayout, ajoutez cette ligne.

app:expandedTitleTextAppearance="@style/TransparentText"

C'est tout les gens!


5

La solution ci-dessous fonctionne parfaitement.

appbar.addOnOffsetChangedListener(new AppBarLayout.OnOffsetChangedListener() {
                @Override
                public void onOffsetChanged(AppBarLayout appBarLayout, int verticalOffset) {
                    if (Math.abs(verticalOffset)-appBarLayout.getTotalScrollRange() == 0)
                    {
                        // Collapsed
                        setTitle("Title To Show");
                    }
                    else
                    {
                        // Expanded
                        setTitle("");
                    }
                }
            });

4

Voici ma solution:

collapsingToolbar.setCollapsedTitleTextAppearance(R.style.personal_collapsed_title);
collapsingToolbar.setExpandedTitleTextAppearance(R.style.personal_expanded_title);

<style name="personal_collapsed_title">
     <item name="android:textSize">18sp</item>
     <item name="android:textColor">@color/black</item>
</style>

<style name="personal_expanded_title">
     <item name="android:textSize">0sp</item>
</style>

2

À mon avis, une solution un peu plus élégante serait quelque chose comme ça.

public class MyCollapsingToolbarLayout extends CollapsingToolbarLayout {

    private final int toolbarId;
    @Nullable private Toolbar toolbar;

    public MyCollapsingToolbarLayout(Context context, AttributeSet attrs) {
        super(context, attrs);

        setTitleEnabled(false);

        TypedArray a = context.obtainStyledAttributes(attrs,
                R.styleable.CollapsingToolbarLayout, 0,
                R.style.Widget_Design_CollapsingToolbar);

        toolbarId = a.getResourceId(android.support.design.R.styleable.CollapsingToolbarLayout_toolbarId, -1);

        a.recycle();

    }

    @Override public void setScrimsShown(boolean shown, boolean animate) {
        super.setScrimsShown(shown, animate);

        findToolbar();
        if (toolbar != null) {
            toolbar.setTitleTextColor(shown ? Color.WHITE : Color.TRANSPARENT);
        }
    }

    private void findToolbar() {
        if (toolbar == null) {
            toolbar = (Toolbar) findViewById(toolbarId);
        }
    }

}

Et l'utilisation ressemblerait à quelque chose comme ça

<butter.droid.widget.BurtterCollapsingToolbarLayout
        app:toolbarId="@+id/toolbar"
        ...>

Il est également possible de fondre / insérer du texte au lieu de simplement l'afficher ou de le cacher.


2

Cela fonctionne pour moi.

final Toolbar tool = (Toolbar)findViewById(R.id.toolbar);
CollapsingToolbarLayout c = (CollapsingToolbarLayout)findViewById(R.id.collapsing_toolbar);
AppBarLayout appbar = (AppBarLayout)findViewById(R.id.app_bar_layout);
tool.setTitle("");
setSupportActionBar(tool);
c.setTitleEnabled(false);

appbar.addOnOffsetChangedListener(new AppBarLayout.OnOffsetChangedListener() {
    boolean isVisible = true;
    int scrollRange = -1;
    @Override
    public void onOffsetChanged(AppBarLayout appBarLayout, int verticalOffset) {
        if (scrollRange == -1) {
            scrollRange = appBarLayout.getTotalScrollRange();
        }
        if (scrollRange + verticalOffset == 0) {
           tool.setTitle("Title");
            isVisible = true;
        } else if(isVisible) {
            tool.setTitle("");
            isVisible = false;
        }
    }
});

0

Ceci est la version kotlin qui fonctionne pour moi:

appbar.addOnOffsetChangedListener(object : OnOffsetChangedListener {
                var isShow = true
                var scrollRange = -1
                override fun onOffsetChanged(appBarLayout: AppBarLayout, verticalOffset: Int) {
                    if (scrollRange == -1) scrollRange = appBarLayout.totalScrollRange

                    if (scrollRange + verticalOffset == 0) {
                        toolbarLayout.title = "Title"
                        isShow = true
                    } else if (isShow) {
                        toolbarLayout.title = " " //These quote " " with _ space is intended 
                        isShow = false
                    }
                }
            })

0

ajoutez simplement ce code:

     CollapsingToolbarLayout collapsingToolbarLayout = findViewById(R.id.collaps_main);

collapsingToolbarLayout.setExpandedTitleColor(ContextCompat.getColor(this , android.R.color.transparent));
En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.