CollapsingToolbarLayout-Titel nur anzeigen, wenn er reduziert ist

145

Ich habe versucht setExpandedTitleColorund setCollapsedTitleColor(Wechsel zu und von transparent) ohne Glück. Ich kann auch keine eingebauten Methoden sehen, die das tun, wonach ich suche.

Ich möchte den Titel nur anzeigen, wenn das CollapsingToolbarLayout vollständig reduziert ist. Andernfalls muss es ausgeblendet werden.

Irgendwelche Hinweise?

Psest328
quelle

Antworten:

285

Sie können hinzufügen, OnOffsetChangedListenerum AppBarLayoutzu bestimmen, wann CollapsingToolbarLayoutes reduziert oder erweitert wird, und den Titel festlegen.

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
quelle
1
Diese Lösung funktioniert für API 23 und höher. Dies ist die richtigste Lösung.
Simon
Bitte markieren Sie dies als die richtige Antwort. Die Antwort von @dlohani, die derzeit als korrekt markiert ist, verbirgt den Text nicht, da Sie den Übergang sehen können.
Themichaelscott
9
Es hat bei mir funktioniert, musste aber "boolean isShow = false" in true ändern, um den App-Namen in der erweiterten Symbolleiste beim Start der Aktivität zu entfernen.
DH28
3
@ Giuseppe: es ist das gleiche. Getestet auf API 16 -> Working
Luckyhandler
1
Dies hat bei mir nicht funktioniert, manchmal wird der Titel überhaupt nicht angezeigt, selbst wenn in meinen Protokollen eindeutig angegeben ist, dass setTitle mit "Title"
aufgerufen wurde
47

Ich habe Dlohanis Lösung ausprobiert, aber es hat mir wegen des Ausblendens nicht gefallen. Mit dieser Lösung entfernen Sie das Ausbleichen vollständig.

Der Trick besteht darin, einen neuen Stil mit textSize gleich 0.1sp oder 0sp (dieser stürzt im SDK <19 ab) und textColor transparent zu erstellen:

Für SDK <19

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

Für SDK> = 19

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

Wenden Sie es dann auf das CollapsingToolbarLayout in Ihrem Layout an:

    <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">
Rúben Sousa
quelle
Ok, wie immer, dies ist eine andere Lösung, die nicht für alle Geräte gleich funktioniert. Auf Kitkat 0sp scheint zu funktionieren, aber auf Jellybean stürzt die App ab. 0.1sp funktioniert auf Jellybean, macht aber den Text auf Kitkat wackelig :(
Rúben Sousa
Wie können wir dieses API-Level-Limit für den Stil festlegen?
Mahm00d
Sie müssen den Ordner values-v19 für SDK> = 19 und den Ordner values ​​für SDK <19 verwenden. Sehen Sie sich dies als Referenz an: stackoverflow.com/questions/16624317/…
Rúben Sousa
1
Dies funktioniert auf N, während die Lösung von @dlohani dies nicht tat
Tyler Pfaff
1
Dies ist die einfachste und beste Lösung. Ich danke dir sehr.
Vikash Parajuli
38

Ich konnte den gewünschten Effekt erzielen, indem ich dem XML-Layout die folgende Eigenschaft hinzufügte:

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

Mein CollapsingToolbarLayout sieht also so aus

<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
quelle
Das ist großartig :) Gibt es irgendwelche Probleme mit dem Titel, um eine Animation zu entwickeln?
Lubos Mudrak
7
Das ist schrecklich, du siehst, wie es einbricht, wenn es zusammenbricht. Vielmehr wird es nur in seiner endgültigen Position eingeblendet.
CaptRisky
1
Das Gleiche gilt für das, was CaptRisky gesagt hat. Leider glaube ich nicht, dass es eine Alternative gibt :-(
Kenyee
9
Dies funktioniert nur, wenn Sie die Android-API 22 oder niedriger verwenden. Bei 23 oder höher funktioniert die Lösung nicht. Sie müssen die Lösung von @ steven274 verwenden.
Simon
1
Es funktioniert noch besser, während ich es auf Android API 23 versucht habe
Dlohani
24

Ich habe eine einfachere Antwort:

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

Viel Spaß beim Codieren!

Shrini Jaiswal
quelle
4
Dies führt zu demselben Problem wie in anderen Antworten.
Themichaelscott
Ich wollte nur die mCollapsingToolbarLayout.setExpandedTitleColor(Color.argb(255,0,0,0))
Symbolleisten-Titelfarbe
@ Bartosz Kosarzycki, ich hatte Pech mit mCollapsingToolbarLayout.setExpandedTitleColor (Color.argb (255,0,0,0)); aber mCollapsingToolbarLayout.setExpandedTitleColor (context.getResources (). getColor (android.R.color.transparent)); hat den Job gemacht, ergibt sich aber sicherlich aus Ihrer Lösung :)
ShayHaned
24

Dieser Code funktioniert für mich: Verwenden Sie color.parse color, denn wenn Ihre Hintergrundfarbe unterschiedlich ist, ersetzen Sie sie durch Weiß und Ihr Titel wird nicht angezeigt

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

Oder Sie können für transparent verwenden collapsingToolbarLayout.setExpandedTitleColor(Color.TRANSPARENT);

Hardik Dudhaiya
quelle
Keine zusätzlichen Zuhörer arbeiten wie erwartet!
Mrityunjay Kumar
19

Ich habe erfolgreich eine verblassende Textansicht hinzugefügt, einfach eine Textansicht in die Symbolleiste eingefügt und deren Alpha basierend auf dem VerticalOffset im Appbar-Rückruf festgelegt

mAppBarLayout.addOnOffsetChangedListener(new AppBarLayout.OnOffsetChangedListener() {

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

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

Hier die einfachste und funktionierendste Lösung auch mit API 23:

app: expandTitleTextAppearance muss TextAppearance erben.

Fügen Sie also in Ihrer styles.xml die folgenden Zeilen hinzu:

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

Fügen Sie dann in Ihrem CollapsingToolbarLayout diese Zeile hinzu.

app:expandedTitleTextAppearance="@style/TransparentText"

Das war's Leute!

Alecs
quelle
5

Die folgende Lösung funktioniert einwandfrei.

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
quelle
4

Hier ist meine Lösung:

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
quelle
2

In meiner Meinung wäre eine etwas elegantere Lösung so etwas.

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);
        }
    }

}

Und die Nutzung würde ungefähr so ​​aussehen

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

Es besteht auch die Möglichkeit, Text auszublenden, anstatt ihn nur ein- oder auszublenden.

Blaz
quelle
2

Das funktioniert bei mir.

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
quelle
0

Dies ist die Kotlin-Version, die für mich funktioniert:

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
quelle
0

Fügen Sie einfach diesen Code hinzu:

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

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