Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

CollapsingToolbarLayout: Change menu item icon color when it is expanded

I'm using CollapsingToolbarLayout in my project.

When the CollapsingToolbarLayout is expanded, By default it is white(i.e defined in android:textColorSecondary in style.xml).

My question:

I want to change my menu item icon color.

enter image description here here is my code:

xml file:

<android.support.design.widget.AppBarLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
android:id="@+id/appbar_layout"
android:layout_width="match_parent"
android:layout_height="200dp"
android:theme="@style/ThemeOverlay.AppCompat.Dark.ActionBar">

<android.support.design.widget.CollapsingToolbarLayout
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    app:contentScrim="?attr/colorPrimary"
    app:layout_scrollFlags="scroll|exitUntilCollapsed"
    app:titleEnabled="false">

    <com.google.android.gms.maps.MapView
        android:id="@+id/mapView"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:scaleType="centerCrop"
        app:layout_collapseMode="parallax" />

    <android.support.v7.widget.Toolbar
        android:id="@+id/toolbar"
        android:layout_width="match_parent"
        android:layout_height="?attr/actionBarSize"
        app:layout_collapseMode="pin" />

</android.support.design.widget.CollapsingToolbarLayout>

MainActivity code:

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

            @Override
            public void onOffsetChanged(AppBarLayout appBarLayout, int verticalOffset) {
                if (scrollRange == -1) {
                    scrollRange = appBarLayout.getTotalScrollRange();
                }
                if (scrollRange + verticalOffset == 0) {
                    //collapse map
                    //TODO: change share icon color - set white share icon
                    isShow = true;
                } else if (isShow) {
                    //expanded map
                    //TODO: change share icon color - set dark share icon
                    isShow = false;
                }
                }
            });

What i have tried so far:

  1. How to change toolbar icons color on collapsing

set toolbar.getNavigationIcon().setColorFilter(getResources().getColor(R.color.white), PorterDuff.Mode.SRC_ATOP); but it changes back button color, while i want to change share button icon color.

  1. Set Toolbar Icon Colour Programmatically

DrawableCompat.setTint not work in my case.

Thanks.

like image 889
Mitesh Vanaliya Avatar asked Dec 12 '17 11:12

Mitesh Vanaliya


2 Answers

I would do this way:

private Drawable drawable;

public boolean onCreateOptionsMenu(Menu menu) {
    getMenuInflater().inflate(R.menu.your_menu, menu);
    drawable = menu.getItem(0).getIcon(); // set 0 if you have only one item in menu 
    //this also will work 
    //drawable = menu.findItem(your item id).getIcon();
    //
    if(drawable != null) {
        drawable.mutate();
    }
    return true;
}

Now in onOffsetChanged

        @Override
            public void onOffsetChanged(AppBarLayout appBarLayout, int verticalOffset) {
                if (scrollRange == -1) {
                        scrollRange = appBarLayout.getTotalScrollRange();
                }
                if (scrollRange + verticalOffset == 0) {
                        //collapse map
                        //TODO: change share icon color - set white share icon
                        isShow = true;
                        drawable.setColorFilter(getResources().getColor(R.color.white), PorterDuff.Mode.SRC_ATOP);
                } else if (isShow) {
                        //expanded map
                        //TODO: change share icon color - set dark share icon
                        isShow = false;
                        drawable.setColorFilter(getResources().getColor(R.color.shadow), PorterDuff.Mode.SRC_ATOP);
                }
            }
like image 111
AloDev Avatar answered Nov 16 '22 07:11

AloDev


Try this code. Hope it will solve your problem.

appBarLayout.addOnOffsetChangedListener(new AppBarLayout.OnOffsetChangedListener() {
        @Override
        public void onOffsetChanged(AppBarLayout appBarLayout, int offset)
        {
            Drawable upArrow = ResourcesCompat.getDrawable(getResources(), R.drawable.drawer_icon, null);
            if (offset < -200)
            {
                upArrow.setColorFilter(Color.parseColor("#000000"), PorterDuff.Mode.SRC_ATOP);
                getSupportActionBar().setHomeAsUpIndicator(upArrow);

                Drawable drawable = ContextCompat.getDrawable(getApplicationContext(),R.drawable.option_menu_icon);
                drawable.setColorFilter(Color.parseColor("#000000"), PorterDuff.Mode.SRC_ATOP);
                toolbar.setOverflowIcon(drawable);
            }
            else
            {

                upArrow.setColorFilter(Color.parseColor("#ffffff"), PorterDuff.Mode.SRC_ATOP);
                getSupportActionBar().setHomeAsUpIndicator(upArrow);
                getSupportActionBar().setDisplayHomeAsUpEnabled(true);

                Drawable drawable = ContextCompat.getDrawable(getApplicationContext(),R.drawable.option_menu_icon);
                drawable.setColorFilter(Color.parseColor("#ffffff"), PorterDuff.Mode.SRC_ATOP);
                toolbar.setOverflowIcon(drawable);
            }
        }
    });
like image 22
Dharmishtha Avatar answered Nov 16 '22 06:11

Dharmishtha