[android] theme, attr, style, color ,values 정리

2021. 2. 26. 10:53모바일/Android_Java

스타일과 테마

테마 != 스타일

스타일

  • 스타일은 view attribute(뷰 속성)의 모음입니다. 스타일을 Map<view attribute, values>라고 생각해도 됩니다.. key들은 View attribute들이에요. 예를 들어 widget에 선언되는 속성들, 즉 layout파일에 선언된 것들이요. 스타일은 한 타입의 widget을 나타냅니다.
<style name="Base.Widget.Design.TabLayout" parent="android:Widget">
    <item name = "tabIndicatorColor">?attr/colorAccent</item>
    ...
</style>

테마

  • 테마는 style과 layout 등에 적용될 수 있는 리소스들의 집합니다.
  • 앱 전체적으로 적용되는 리소스의 집합을 일컫습니다.
  • 테마는 interface(인터페이스)와 비슷

attr 사용법

1.

Custom Attribute 사용

Custom Widget에 자신의 Attrs를 설정하고 싶을 경우가 있다.

다음과 같은 순서로 진행하면 사용할 수 있다.

  1. attrs.xml에 사용자 속성 정의
<?xml version="1.0" encoding="utf-8"?>
<resources>
    <declare-styleable name="ExButton">
        <attr name="image_src" format="reference"/>
    </declare-styleable>    
</resources>

- declare-styleable 태그 안에 attr 태그로 사용자 속성을 정의합니다. declare-styleable 태그안의 name 속성은 커스텀 위젯 소스코드(.java)에서 사용자 속성의 값을 가져오기 위해 사용됨

- attr 태그의 format 속성의 값으로는 boolean, integer, float, dimension, reference(id값), string, color(색상코드값), fraction, enum, flag 등이 있음

  1. xml의 Custom Widget에 사용자 속성 정의

커스텀 위젯에 사용자 속성을 정의합니다.

이를 위해서는 먼저 사용자 속성을 사용하기 위한 네임스페이스를 지정해 주어야 합니다.

xml파일에 보면 최상위 layout의 attr에 지정되어 있는 android가 이런것이다.

네임스페이스명은 마음대로 지정하면 되고, 패키지명은 꼭 자신이 개발하고 있는 패키지명을 지정하도록 합니다.

설정의 예는 다음과 같음.

<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:exbutton="http://schemas.android.com/apk/res/com.mrgamza.test"
    android:layout_width="fill_parent"
    android:layout_height="fill_parent" >
    <TextView
        android:id="@+id/textview"
        android:layout_alignParentLeft="true"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content" />
    <com.mrgamza.test.ExButton
        android:id="@+id/exbutton"
        android:layout_below="@id/textview"
        android:layout_width="fill_parent"
        android:layout_height="fill_parent"
        exbutton:image_src="@drawable/normal_image" />
</RelativeLayout> 
  1. 커스텀위젯 소스코드에서 사용자 속성 사용

CustomView의 소스코드의 생성자에서 attr 파라미터 값을 이용해 TypeArray객체를 이용하여 가져와 사용합니다.

public ExButton(Context context, AttributeSet attr) {

    super(context, attr);

    TypedArray typedArray = context.obtainStyledAttributes(attr, R.styleable.ExButton);
    int imageSrc = typedArray.getResourceId(R.styleable.ExButton_image_src, 0);
    typedArray.recycle();
}

출처 : xmlns:[네임스페이스명]="http://schemas.android.com/apk/res/[어플의 패키지명]"

2.

  • layout 파일
<TabLayout 
           android:background = "?attr/listLineColor">

</TabLayout>
  • attr파일
<resources>
    <attr name = "listLineColor" format ="reference"/>
</resources>
  • themes/themes.xml
<resources>
    <style name = "Theme.~~">
        <item name="listeLineColor">@color/black</item>
    </style>
</resources>

테마변경

  • values-night/themes.xml 폴더에 저장되어있는 아이템들의 컬러 테마는 시스템 설정에서 테마를 변경해야 적용이된다.. application tag에서 바꿔주는것은 적용이 안된다
  • 왜일까?

코드로 변경

protected void onCreate(Bundle savedInstnaceState){
    super.oncreate(savedInstanceState);
    setTheme(R.style.BlackTheme);

}
  • 이 때 BlackTheme이름을 가진 style태그는 부모태그(parent)를 빼야 한다