테마를 활용하면 스타일과 레이아웃을 유연하게 작성하고, 변경을 격리할 수 있다.
특히, 테마 속성(theme attributes)을 사용하여 리소스를 간접적으로 참조하는 방식을 추천한다.
이를 통해 리소스를 다양하게 변경할 수 있으며(예: 다크 테마 지원), 레이아웃이나 스타일에서 직접적으로 리소스를 참조하거나 하드코딩된 값 사용을 피하고, 테마 속성을 사용하는 것이 권장된다.
Material 색상 시스템은 의미론적 이름을 사용해 색상을 정의한다.
?attr/colorPrimary
: 앱의 주요 브랜딩 색상.?attr/colorSecondary
: 앱의 보조 브랜딩 색상, 일반적으로 주요 브랜딩 색상의 밝은 보완 색상.?attr/colorOn[Primary, Secondary, Surface 등]
: 지정된 색상 위에서 대비를 이루는 색상.?attr/color[Primary, Secondary] Variant
: 주어진 색상의 대체 음영.?attr/colorSurface
: 카드, 시트, 메뉴와 같은 구성 요소 표면 색상.?android:attr/colorBackground
: 화면 배경색상.?attr/colorError
: 오류 표시 색상.?attr/colorPrimarySurface
:?attr/colorControlNormal
: 기본 상태 아이콘/컨트롤 색상.?attr/colorControlActivated
: 활성 상태의 아이콘/컨트롤 색상.?attr/colorControlHighlight
:?android:attr/textColorPrimary
: 주요 텍스트 색상.?android:attr/textColorSecondary
: 보조 텍스트 색상.?attr/listPreferredItemHeight
: 리스트 항목의 표준(최소) 높이.?attr/actionBarSize
: 툴바 높이.?attr/selectableItemBackground
:?attr/selectableItemBackgroundBorderless
: 경계 없는 리플.?attr/dividerVertical
: 수직 구분선 드로어블.?attr/dividerHorizontal
: 수평 구분선 드로어블.Material 텍스트 스타일 스케일
?attr/textAppearanceHeadline1
: 기본 96sp 크기의 light 텍스트?attr/textAppearanceHeadline3
: 기본 48sp 크기의 regular 텍스트.?attr/textAppearanceHeadline6
: 기본 20sp 크기의 medium 텍스트.?attr/textAppearanceSubtitle1
: 기본 16sp 크기의 regular 텍스트?attr/textAppearanceBody1
: 기본 16sp 크기의 regular 텍스트.?attr/textAppearanceButton
: 버튼 텍스트 (기본 14sp, 대문자).Material의 모양 시스템은 구성 요소의 모양을 쉽게 정의하고, 테마와 연동하여 유지보수를 단순화한다.
커스텀 구성 요소에서 모양을 설정할 때는 MaterialShapeDrawable
을 사용하는 것이 가장 안정적이며, 권장된다.
?attr/shapeAppearanceSmallComponent
:
버튼, 칩, 텍스트 필드 등에 사용 (기본 4dp 둥근 모서리).
?attr/shapeAppearanceMediumComponent
:
카드, 다이얼로그, 날짜 선택기 등 중간 크기 구성 요소에 사용. (기본 4dp 둥근 모서리).
?attr/shapeAppearanceLargeComponent
:
바텀 시트 등에 사용 (기본 0dp 모서리, 사각형).
Material에서 제공하는 버튼 스타일:
?attr/materialButtonStyle
:
기본 Contained(포함) 스타일 버튼.
별도로 스타일을 지정하지 않으면 이 스타일이 기본값으로 적용된다.
?attr/borderlessButtonStyle
:
텍스트 스타일 버튼을 위한 속성.
테두리나 배경 없이 깔끔한 텍스트만 표시된다.
?attr/materialButtonOutlinedStyle
:
Outlined(외곽선) 스타일 버튼을 위한 속성.
버튼 외곽에 테두리가 있는 스타일로, 비활성화된 느낌을 줄 때 자주 사용된다.
?android:attr/disabledAlpha
:
위젯이 비활성화 상태일 때 적용되는 기본 투명도(alpha) 값.
?android:attr/primaryContentAlpha
:
주요 콘텐츠(foreground 요소)에 적용되는 투명도 값.
?android:attr/secondaryContentAlpha
:
보조 콘텐츠(secondary 요소)에 적용되는 투명도 값.
?android:attr/foo
:?attr/bar
:비플랫폼 속성을 사용하는 것이 더 유리하다 더 넓은 호환성을 보장하며, 모든 API 레벨에서 사용할 수 있도록 백포트(backport)되었기 때문이다.
백포트란? 이전 API 레벨에서도 해당 기능을 사용할 수 있도록 지원하는 것
테마 속성으로 추상화되지 않은 요소는 사용자 정의 테마 속성을 생성하여 관리할 수 있다.
테마 속성을 사용하면 같은 레이아웃을 기반으로 화면별로 유연하게 커스터마이징할 수 있다.
이는 유지보수성을 높이고 코드 중복을 줄이는 데 도움이 된다
출처 : https://medium.com/androiddevelopers/android-styling
테마 속성을 사용하면 dark theme와 같은 테마를 더 쉽게 지원할 수 있으며,
더 유연하고 유지보수 가능한 코드를 작성할 수 있게 된다
Material Design 시스템의 고급 기능을 활용하려면 MDC를 사용해야 합니다.
특히, Material의 모양(Shape) 시스템이나 다크 테마 전환, MaterialButton 스타일과 같은 고급 기능은 MDC가 필요합니다.
?attr/shapeAppearanceSmallComponent
,
?attr/materialButtonOutlinedStyle
등은 MDC에서만 동작합니다.