https://www.codeandkits.com/Blog/2018/03/26/an-android-toolbar-and-action-bar-color-guide/

https://android.jlelse.eu/lessons-in-kotlin-the-toolbar-icons-and-reflection-79e77208367e <- 이것도 정리해서 반영하기

  • android.support.v7.widget.Toolbar을 사용하였다고 가정함.

  • AppTheme는 <style name="AppTheme"></style>를 나타내며

  • ActionBarTheme는 <style name="ActionbarTheme"></style>를 나타낸다.

  • AppTheme.actionModeBackground는 다음를 나타낸다.

<style name="AppTheme">
  <item name="actionModeBackground"></item>
</style>

Action bar

Action bar는 actionBarThemeactionBarPopupTheme에 의해 style이 적용된다.

<style name="AppTheme" parent="Theme.AppCompat.Light.DarkActionBar">
    <item name="actionBarTheme">@style/ActionbarTheme</item>
    <item name="actionBarPopupTheme">@style/ActionbarPopupTheme</item>
</style>

기본 액션바는 흰색 컨트롤과 검정색 아이콘 그리고 `@color/colorAccent` 색상의 경계선을 가지는 회색이다.

빈 스타일의 actionBarTheme를 설정하면 회색 컨트롤을 가지는 흰색이 된다.

  • AppTheme.actionModeBackground - 배경 색

raw color string은 지원하지 않지만 (##009688), 참조는 지원한다 (@color/colorName)

  • ActionbarTheme.colorAccent - 테두리 색상

  • ActionbarTheme.colorControlNormal - 홈 아이콘 및 오버플로 아이콘의 색상

  • ActionbarTheme.android:tint 홈 아이콘, 오버플로 아이콘 및 메뉴 아이콘의 색상 변경

프로그래밍 방식으로 메뉴 아이콘의 색조를 변경하는 경우 -

(vectorDrawables.useSupportLibrary = true가 gradle의 defaultConfig에 포함되어 있어야 한다.)

// onCreateOptionsMenu 또는 onCreateActionMode의 끝에 추가
void tintMenuIcons(Menu menu)
{
  MenuItem item;
  int color;

  AppCompatDelegate.setCompatVectorFromResourcesEnabled(true);

  for(int i = 0; i < menu.size(); i++)
  {
    item  = menu.getItem(i);
    color = Color.parseColor("#009688");

    DrawableCompat.setTint(item.getIcon(), color);
  }
}
  • ActionbarPopupTheme.android:background - 오버플로 메뉴의 배경색

  • ActionbarPopupTheme.android : textColor - 오버플로 메뉴의 택스트 색상

Toolbar

툴바는 style과 theme, popupTheme를 사용한다.

<style name="ToolbarStyle">
    <item name="popupTheme">@style/ToolbarPopupTheme</item>
    <item name="theme">@style/ToolbarTheme</item>
</style>
<android.support.v7.widget.Toolbar
    android:id="@+id/mainToolbar"
    android:layout_width="match_parent"
    android:layout_height="?attr/actionBarSize"
    android:background="?attr/colorPrimary"
    android:elevation="4dp"
    android:theme="@style/ToolbarStyle"
    app:popupTheme="@style/ThemeOverlay.AppCompat.Light"/>
override fun onCreate(savedInstanceState: Bundle?) {
    super.onCreate(savedInstanceState)
    setContentView(R.layout.activity_main)
    setSupportActionBar(mainToolbar)
}
...
override fun onCreateOptionsMenu(menu: Menu?): Boolean {
    menuInflater.inflate(R.menu.main_menu, menu)
    return true
}
...
override fun onPrepareOptionsMenu(menu: Menu?): Boolean {
    menu?.let {
        if (menu is MenuBuilder) {
            try {
                val field = menu.javaClass.getDeclaredField("mOptionalIconsVisible")
                field.isAccessible = true
                field.setBoolean(menu, true)
            } catch (ignored: Exception) {
                // ignored exception 
            }
        }
    }
    return super.onPrepareOptionsMenu(menu)
}

the toolbar is just a container with some default content. Replace the content and you can do whatever you want. However, the underlying capabilities like displaying a menu with icons are still in the code. They are just hidden so we can’t see them. We can use reflection to expose them.

툴바의 기본 배경색은 흰색 텍스트를 가진 @color/colorPrimary이다.

theme에 빈 style를 설정하고 백그라운드를 지우면 회색 콘트롤을 가진 흰색이 된다.

  • ToolbarStyle.android:background - 배경색

  • ToolbarStyle.titleTextColor - 타이틀 텍스트 컬러

  • ToolbarStyle.subtitleTextColor - 서브 타이틀 텍스트 컬러

  • ToolbarTheme.colorControlNormal - 홈 아이콘과 오버플로 아이콘의 색상

이 값을 변경하면 Action bar의 유사한 아이콘에 의도치 않은 영향을 준다.

툴바의 설정값을 오버라이드하려면 ActionbarTheme.colorControlNormal를 설정한다.

  • ToolbarTheme.android:tint - 홈 아이콘, 오버플로 아이콘 및 메뉴 아이콘의 색상 변경

이 값을 변경하면 Action bar의 유사한 아이콘에 의도치 않은 영향을 준다.

툴바의 설정값을 오버라이드하려면 ActionbarTheme.android:tint를 설정한다.

package com.shellmonger.apps.familyphotos.extensions

import android.graphics.PorterDuff
import android.graphics.drawable.Drawable

fun Drawable.setIconColor(color: Int) {
    mutate()
    setColorFilter(color, PorterDuff.Mode.SRC_ATOP)
}

...

// Now I can write something like:
menuItem.icon.setIconColor(Color.BLACK)
package com.shellmonger.apps.familyphotos.extensions

import android.view.MenuItem

fun MenuItem.getShowAsAction(): Int {
    var f = this.javaClass.getDeclaredField("mShowAsAction")
    f.isAccessible = true
    return f.getInt(this)
}
override fun onPrepareOptionsMenu(menu: Menu?): Boolean {
    menu?.let {
        if (menu is MenuBuilder) {
            try {
                val field = menu.javaClass.getDeclaredField("mOptionalIconsVisible")
                field.isAccessible = true
                field.setBoolean(menu, true)
            } catch (ignored: Exception) {
                logger.debug("ignored exception: ${ignored.javaClass.simpleName}")
            }
        }

        for (item in 0 until menu.size()) {
            val menuItem = menu.getItem(item)
            menuItem.icon.setIconColor(
                if (menuItem.getShowAsAction() == 0) Color.BLACK
                else Color.WHITE
            )
        }
    }
    return super.onPrepareOptionsMenu(menu)
}
  • ToolbarPopupTheme.android:background - 오버플로 메뉴의 배경색

  • ToolbarPopupTheme.android:textColor - 오버플로 메뉴의 텍스트 색상

results matching ""

    No results matching ""