3

Как я могу установить цвет значков (значок меню дома и переполнения) в файле Toolbar/AppBarLayoutпрограммно?Set Toolbar Icon Color Programmatically

Я хочу изменить цветовую схему панели инструментов для одного фрагмента в действии. Установка фона AppBarLayout на светлый цвет (например, светло-серый с appBarLayout.setBackgroundResource(..);) приводит к белым значкам и белому заголовку, который едва заметен.

Его схема выглядит следующим образом:

<android.support.design.widget.AppBarLayout 
    android:id="@+id/appbar" 
    android:layout_width="match_parent" 
    android:layout_height="wrap_content" 
    android:fitsSystemWindows="true"> 

    <android.support.v7.widget.Toolbar 
     android:id="@+id/toolbar" 
     android:layout_width="match_parent" 
     android:layout_height="?attr/actionBarSize" 
     android:theme="@style/ToolbarStyle" 
     app:layout_scrollFlags="scroll|enterAlways"/> 

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

Solution found

+0

, что у вас в @ стиле/ToolbarStyle? – ootinii

+0

Значок меню с 3 точками называется значком переполнения –

+0

@ootinii Не должно иметь значения - мне нужно переопределить этот стиль с помощью кода в определенном фрагменте –

ответ

5

значок Изменение перелива легко с поддержкой 23. Вот метод из Lorne Laliberte answer

public static void setOverflowButtonColor(final Toolbar toolbar, final int color) { 
    Drawable drawable = toolbar.getOverflowIcon(); 
    if(drawable != null) { 
     drawable = DrawableCompat.wrap(drawable); 
     DrawableCompat.setTint(drawable.mutate(), color); 
     toolbar.setOverflowIcon(drawable); 
    } 
} 

You может изменить ваш дом в проезжавшие пользовательский Drawable ..

getSupportActionBar().setHomeAsUpIndicator(R.drawable.your_drawable) 

или изменить его цвет

final Drawable upArrow = getResources().getDrawable(R.drawable.abc_ic_ab_back_mtrl_am_alpha); 
upArrow.setColorFilter(Color.parseColor("#FFFFFF"), PorterDuff.Mode.SRC_ATOP); 
getSupportActionBar().setHomeAsUpIndicator(upArrow); 

EDIT: Если вы хотите изменить другие элементы here хороший пост, чтобы изменить все иконки панели инструментов цвета.

Надеюсь, что это поможет!

+0

Эй, это очень помогло! Я использовал свой первый фрагмент кода, чтобы изменить цвет кнопки переполнения и первый фрагмент кода из [связанного сообщения] (https://snow.dog/blog/how-to-dynamicaly-change-android-toolbar-icons-color/), чтобы изменить цвет других видов панели инструментов. Я принял ваш ответ, потому что это было так полезно, но я собираюсь добавить свой собственный метод, который представляет собой комбинацию нескольких фрагментов кода. –

0

Вы можете изменить home в up icon на рисунке код:

Drawable upArrow = ContextCompat.getDrawable(this, R.drawable.back); 
getSupportActionBar().setHomeAsUpIndicator(upArrow); 
0

Я принявшего most helpful answer (and commented on it), объясняя, что я использовал комбинацию своих связанных фрагментов кода для формирования единого AppBarLayout/Toolbar метод окраски , Он содержит фон, заголовок, субтитры, значок задней панели/ящика и цвета значков переполнения, а также добавлены любые пользовательские значения ImageButtons. Вот мой результат (простите английского 'цвет' правописание() ..!):

public static void colouriseToolbar(AppBarLayout appBarLayout, @ColorInt int background, @ColorInt int foreground) { 
    if (appBarLayout == null) return; 

    appBarLayout.setBackgroundColor(background); 

    final Toolbar toolbar = (Toolbar)appBarLayout.getChildAt(0); 
    if (toolbar == null) return; 

    toolbar.setTitleTextColor(foreground); 
    toolbar.setSubtitleTextColor(foreground); 

    final PorterDuffColorFilter colorFilter 
      = new PorterDuffColorFilter(foreground, PorterDuff.Mode.MULTIPLY); 

    for (int i = 0; i < toolbar.getChildCount(); i++) { 
     final View view = toolbar.getChildAt(i); 

     //todo: cal icon? 
     Log.d(Globals.TAG, "view: "+i+" "+view.getClass().toString()); 

     //Back button or drawer open button 
     if (view instanceof ImageButton) { 
      ((ImageButton)view).getDrawable().setColorFilter(colorFilter); 
     } 

     if (view instanceof ActionMenuView) { 
      for (int j = 0; j < ((ActionMenuView) view).getChildCount(); j++) { 

       final View innerView = ((ActionMenuView)view).getChildAt(j); 

       //Any ActionMenuViews - icons that are not back button, text or overflow menu 
       if (innerView instanceof ActionMenuItemView) { 
        Log.d(Globals.TAG, "view (actionmenuitemviwe): "+i); 

        final Drawable[] drawables = ((ActionMenuItemView)innerView).getCompoundDrawables(); 
        for (int k = 0; k < drawables.length; k++) { 

         final Drawable drawable = drawables[k]; 
         if (drawable != null) { 
          final int drawableIndex = k; 
          //Set the color filter in separate thread 
          //by adding it to the message queue - won't work otherwise 
          innerView.post(new Runnable() { 
           @Override 
           public void run() { 
            ((ActionMenuItemView) innerView).getCompoundDrawables()[drawableIndex].setColorFilter(colorFilter); 
           } 
          }); 
         } 
        } 
       } 
      } 
     } 
    } 

    //Overflow icon 
    Drawable overflowIcon = toolbar.getOverflowIcon(); 
    if (overflowIcon != null) { 
     overflowIcon.setColorFilter(colorFilter); 
     toolbar.setOverflowIcon(overflowIcon); 
    } 
}