代码之家  ›  专栏  ›  技术社区  ›  Mitesh Vanaliya

折叠工具栏布局:展开菜单项时更改其图标颜色

  •  6
  • Mitesh Vanaliya  · 技术社区  · 7 年前

    我正在使用 CollapsingToolbarLayout 在我的项目中。

    折叠工具栏布局 展开,默认为白色(即在中定义 android:textColorSecondary 在里面 style.xml ).

    我的问题:

    我想更改菜单项图标的颜色。

    enter image description here 这是我的代码:

    xml文件:

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

    主要活动代码:

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

    到目前为止,我已经尝试了:

    1. How to change toolbar icons color on collapsing

    设置 toolbar.getNavigationIcon().setColorFilter(getResources().getColor(R.color.white), PorterDuff.Mode.SRC_ATOP); 但它会更改后退按钮的颜色,而我想更改共享按钮图标的颜色。

    1. Set Toolbar Icon Colour Programmatically

    DrawableCompat.setTint 对我来说不行。

    谢谢

    2 回复  |  直到 7 年前
        1
  •  9
  •   AloDev    7 年前

    我会这样做:

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

    现在在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);
                    }
                }
    
        2
  •  1
  •   Dharmishtha    7 年前

    请尝试此代码。希望它能解决你的问题。

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