Android CollapsingToolbarLayout einklappen Listener

Lesezeit: 3 Minuten

Benutzer-Avatar
Anaximandro Andrade

ich benutze CollapsingToolBarLayout zusammen mit AppBarLayout und CoordinatorLayout, und sie funktionieren insgesamt einwandfrei. Ich stelle meine ein Toolbar Wenn ich nach oben scrolle, möchte ich wissen, ob es eine Möglichkeit gibt, den Titeltext der Symbolleiste zu ändern, wann CollapsingToolBarLayout es ist zusammengebrochen.

Zusammenfassend möchte ich zwei verschiedene Titel Wenn gescrollt und wann erweitert.

Vielen Dank im Voraus

Dieser Code hat bei mir funktioniert

mAppBarLayout.addOnOffsetChangedListener(new   AppBarLayout.OnOffsetChangedListener() {
        @Override
        public void onOffsetChanged(AppBarLayout appBarLayout, int verticalOffset) {
            if (verticalOffset == -mCollapsingToolbarLayout.getHeight() + mToolbar.getHeight()) {
                //toolbar is collapsed here
                //write your code here
            }
        }
    });

  • Bessere Antwort als Nikola Despotoski

    – GOBINATH.M

    7. März 2017 um 2:26 Uhr

  • Scheint keine zuverlässige Lösung zu sein. Ich habe es getestet und die Werte auf meinem Gerät sind die folgenden: mCollapsingToolbarLayout.getHeight() = 1013, mToolbar.getHeight() = 224. Gemäß Ihrer Lösung muss also verticalOffset im eingeklappten Zustand -789 sein, ist jedoch gleich -693

    – Leonid Ustenko

    3. April 2017 um 14:48 Uhr


Ich teile die vollständige Implementierung, basierend auf dem Code von @Frodi Beggins und @Nifhel:

public abstract class AppBarStateChangeListener implements AppBarLayout.OnOffsetChangedListener {

    public enum State {
        EXPANDED,
        COLLAPSED,
        IDLE
    }

    private State mCurrentState = State.IDLE;

    @Override
    public final void onOffsetChanged(AppBarLayout appBarLayout, int i) {
        if (i == 0) {
            if (mCurrentState != State.EXPANDED) {
                onStateChanged(appBarLayout, State.EXPANDED);
            }
            mCurrentState = State.EXPANDED;
        } else if (Math.abs(i) >= appBarLayout.getTotalScrollRange()) {
            if (mCurrentState != State.COLLAPSED) {
                onStateChanged(appBarLayout, State.COLLAPSED);
            }
            mCurrentState = State.COLLAPSED;
        } else {
            if (mCurrentState != State.IDLE) {
                onStateChanged(appBarLayout, State.IDLE);
            }
            mCurrentState = State.IDLE;
        }
    }

    public abstract void onStateChanged(AppBarLayout appBarLayout, State state);
}

Und dann können Sie es verwenden:

appBarLayout.addOnOffsetChangedListener(new AppBarStateChangeListener() {
    @Override
    public void onStateChanged(AppBarLayout appBarLayout, State state) {
        Log.d("STATE", state.name());
    }
});

  • Das ist richtig. Aber bitte beachten Sie, dass bei Verwendung von Proguard diese Enum in einen Integer-Wert übersetzt wird.

    – rciovati

    20. März 2016 um 1:21 Uhr

  • Das wusste ich nicht. Das ist großartig!

    – tim687

    20. März 2016 um 9:47 Uhr

  • Auch Enums sind eine sehr schöne Möglichkeit, Typsicherheit zu gewährleisten. Sie können State.IMPLODED nicht haben, weil es nicht existiert (der Compiler würde sich beschweren), aber mit Integer-Konstanten könnten Sie einen Wert verwenden, von dem der Compiler keine Ahnung hat, dass er falsch ist. Sie sind auch gut als Singletons, aber das ist eine andere Geschichte.

    – droppin_science

    9. Mai 2017 um 16:24 Uhr

  • @droppin_science für Android-Enums check out IntDef

    – David Darias

    24. Dezember 2017 um 2:37 Uhr

  • @DavidDarias Persönlich finde ich Enums einen viel saubereren Ansatz, selbst mit ihrem Overhead (beginnen Sie hier mit dem Argument … 🙂

    – droppin_science

    15. März 2018 um 13:08 Uhr

Benutzer-Avatar
Fehler passieren

Diese Lösung funktioniert perfekt für mich zu erkennen AppBarLayout kollabiert oder erweitert.

appBarLayout.addOnOffsetChangedListener(new AppBarLayout.OnOffsetChangedListener() {
        @Override
        public void onOffsetChanged(AppBarLayout appBarLayout, int verticalOffset) {

            if (Math.abs(verticalOffset)-appBarLayout.getTotalScrollRange() == 0)
            {
                //  Collapsed


            }
            else
            {
                //Expanded


            }
        }
    });

Gebraucht addOnOffsetChangedListener auf der AppBarLayout.

  • Das ist richtig. Aber bitte beachten Sie, dass bei Verwendung von Proguard diese Enum in einen Integer-Wert übersetzt wird.

    – rciovati

    20. März 2016 um 1:21 Uhr

  • Das wusste ich nicht. Das ist großartig!

    – tim687

    20. März 2016 um 9:47 Uhr

  • Auch Enums sind eine sehr schöne Möglichkeit, Typsicherheit zu gewährleisten. Sie können State.IMPLODED nicht haben, weil es nicht existiert (der Compiler würde sich beschweren), aber mit Integer-Konstanten könnten Sie einen Wert verwenden, von dem der Compiler keine Ahnung hat, dass er falsch ist. Sie sind auch gut als Singletons, aber das ist eine andere Geschichte.

    – droppin_science

    9. Mai 2017 um 16:24 Uhr

  • @droppin_science für Android-Enums check out IntDef

    – David Darias

    24. Dezember 2017 um 2:37 Uhr

  • @DavidDarias Persönlich finde ich Enums einen viel saubereren Ansatz, selbst mit ihrem Overhead (beginnen Sie hier mit dem Argument … 🙂

    – droppin_science

    15. März 2018 um 13:08 Uhr

Benutzer-Avatar
Artur Gniewowski

Dieser Code funktioniert perfekt für mich. Sie können die Prozentskala verwenden, wie Sie möchten

@Override
public void onOffsetChanged(AppBarLayout appBarLayout, int verticalOffset) {
    double percentage = (double) Math.abs(verticalOffset) / collapsingToolbar.getHeight();
    if (percentage > 0.8) {
        collapsingToolbar.setTitle("Collapsed");
    } else {
        collapsingToolbar.setTitle("Expanded");
    }
}

1010650cookie-checkAndroid CollapsingToolbarLayout einklappen Listener

This website is using cookies to improve the user-friendliness. You agree by using the website further.

Privacy policy