【问题标题】:CollapsingToolbarLayout: Change menu item icon color when it is expandedCollapsingToolbarLayout:在展开时更改菜单项图标颜色
【发布时间】:2017-12-12 11:43:29
【问题描述】:

我在我的项目中使用 CollapsingToolbarLayout

CollapsingToolbarLayout展开时,默认为白色(即在style.xml中定义为android:textColorSecondary)。

我的问题:

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

这是我的代码:

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>

MainActivity 代码:

    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 在我的情况下不起作用。

谢谢。

【问题讨论】:

    标签: android android-layout android-collapsingtoolbarlayout


    【解决方案1】:

    我会这样做:

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

      试试这个代码。希望它能解决你的问题。

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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2019-01-20
        • 1970-01-01
        • 2015-11-24
        • 1970-01-01
        • 2011-05-09
        • 1970-01-01
        相关资源
        最近更新 更多