Search code examples
androidandroid-collapsingtoolbarlayout

different back button color in expanded and collapsed states of Collapsing Tollbar


How to set different back button color in expanded and collapsed states of Collapsing Tollbar?

<com.google.android.material.appbar.AppBarLayout
        android:id="@+id/main.appbar"
        android:layout_width="match_parent"
        android:layout_height="300dp"
        android:fitsSystemWindows="true">

        <com.google.android.material.appbar.CollapsingToolbarLayout
            android:id="@+id/main.collapsing"
            android:layout_width="match_parent"
            android:layout_height="match_parent"
            android:fitsSystemWindows="true"
            android:theme="@style/Theme.TopMovie.AppBarOverlay"
            app:contentScrim="?attr/colorOnPrimary"
            app:expandedTitleGravity="bottom|center_horizontal"
            app:expandedTitleMarginEnd="16dp"
            app:scrimAnimationDuration="100"
            app:expandedTitleMarginStart="16dp"
            app:expandedTitleTextAppearance="@style/TitleTextStyle"
            app:layout_scrollFlags="scroll|exitUntilCollapsed"
            app:maxLines="3"
            app:titleCollapseMode="scale">

            <androidx.appcompat.widget.Toolbar
                android:id="@+id/toolbar"
                android:layout_width="match_parent"
                tools:title="TitleTitle"
                android:layout_height="?attr/actionBarSize"
                app:layout_collapseMode="pin" />
        </com.google.android.material.appbar.CollapsingToolbarLayout>
    </com.google.android.material.appbar.AppBarLayout> 
<style name="Theme.TopMovie.AppBarOverlay" parent="ThemeOverlay.AppCompat.Dark.ActionBar" >
        <item name="expandedTitleTextColor">@color/white</item>
        <item name="collapsedTitleTextColor">?attr/colorOnSecondary</item>
        <item name="colorControlNormal">?attr/colorOnSecondary</item>
    </style>

colorControlNormal sets color in all states, but I need different colors .


Solution

  • You can detect AppBarLayout collapsed or expanded using onOffsetChanged. below is a sample code for onOffsetChanged Listener Class :

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

    And then you can use it:

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