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는 actionBarTheme과 actionBarPopupTheme에 의해 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 - 오버플로 메뉴의 텍스트 색상