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?

Psest328
la source

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
    }
})
steven274
la source
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">
Ruben Sousa
la source
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">
dlohani
la source
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!

Shrini Jaiswal
la source
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);

Hardik Dudhaiya
la source
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()));
        }
    });
Vishal
la source
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!

Alecs
la source
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("");
                    }
                }
            });
Parth Patel
la source
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>
Shaun
la source
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.

Blaz
la source
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;
        }
    }
});
Aistis
la source
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
                    }
                }
            })
realpranav
la source
0

ajoutez simplement ce code:

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

collapsingToolbarLayout.setExpandedTitleColor(ContextCompat.getColor(this , android.R.color.transparent));
AlimItTech
la source