2012년 1월 9일 월요일

어디에서나 Holo

[스타일을 다루는 안드로이드 프레임워크 엔지니어 Adam Powell가 쓴 글입니다. -Tim Bray](이 글은 Holo Everywhere의 번역입니다.)

안드로이드 4.0에서 Holo 테마 패밀리를 소개했습니다. 안드로이드 3.0부터 소개된 Holo가 더 세련되어진 것입니다. 하지만 이전에는 몇몇 디바이스에선 시스템 테마가 Holo로 갱신되지  않았거나 일반적으로 쓸 수 없었습니다. 많은 개발자들이 이 점을 알고 있었죠. 시스템 테마를 쓰면 사용자가 기존에 원하던 대로 쓸 수 있고, 개발자가 개발 기간을 줄일 수 있는 이점이 있습니다. 이런 이점은 앱 개발자가 결과를 신뢰성 있게 예측할 수 있을 때 만 가능합니다. 안드로이드 4.0 이전에는 장비마다 시스템 테마가 차이났기에 예측 가능한 하나의 룩 앤 필을 가지는 앱을 만드는게 어려웠습니다. 우리는 개발자 커뮤니티를 위해 아이스크림샌드위치부터 이 상황을 개선하였습니다.

Theme.Holo
만약 안드로이드 스타일과 테마 시스템에 낯설다면 아래 글을 계속 보기 전에 스타일과 테마를 먼저 읽는 것을 추천합니다.


호환성 표준

안드로이드 4.0에서 Holo부터는 사정이 달라졌습니다. 구글은 Holo 테마 패밀리를 안드로이드 4.0 이상의 디바이스 호환성 요구사항으로 포함시켰습니다. 디바이스가 안드로이드 마켓을 탑재할려면 오리지날 Holo 테마를 그대로 포함해야 합니다.

표준화는 Holo 위젯 스타일 전체에도 해당됩니다. Widget.Holo 스타일은 모든 디바이스에서 안정화되기 때문에 여러 분의 앱에서 점진적인 수정용 부모 스타일로 안전하게 쓸 수 있습니다. (주: 안드로이드의 스타일도 부모로 부터 상속을 받을 수 있습니다.)

안드로이드 4.0의 Holo 테마 패밀리는 Theme.Holo, Theme.Holo.Light, Theme.Holo.Light.DarkActionBar를 포함합니다. 작동중인 테마들의 예는 이 글의 스크린 샷들에서 볼 수 있습니다.

Holo 테마를 사용하려면 메니페스트(manifest)나 애플리케이션 요소에서 하나를 명시적으로 지정합니다. (예: android:theme="@android:style/Theme.Holo".) 모든 안드로이드 4.0 호환 디바이스에서 변경없이 그대로 뜰 것입니다. Holo 테마는 앱에서 커스터마이징을 하기 위한 안정된 부모 테마입니다.
Theme.Holo.Light

디바이스 테마는 어때요?

우리는 제조사가 그들의 디바이스 전반에 자사의 테마로 사용자 경험을 만드는 것을 막을 생각은 없습니다. 사실은 우리는 제조사가 커스터마이징하기 더 쉽도록 더 나아간 것입니다. 안드로이드 4.0 API (레벨 14)에서 안드로이드 3.0에 소개된 Holo 패밀리를 보완할 새로운 공용 테마 패밀리, DeviceDefault 추가했습니다. DeviceDefault 테마는 디바이스의 고유의 룩 앤 필에 대한 별명입니다. DeviceDefault 테마 패밀리와 위젯 스타일 패밀리는 개발자로 하여금 온전한 디바이스 고유 테마를 선택할 수 있게 합니다.

공식적으로 이 테마들의 분리는 디바이스의 업데이트를 더 빠르게 만들고, 제조사가 추후에 새로운 플랫폼 버전을 통합하는 걸 쉽게 하는 것입니다. 구글 넥서스 디바이스들은 수정안된 Holo 테마를 DeviceDefault라고 별칭 붙였습니다.

선택한 테마를 사용하기

우리는 테마를 적용한 앱에 여러 공통 미터법과 색상 팔레트를 사용할 수 있도록 여러 테마 속성을 추가하였습니다. 리스트 아이템과 같은 UI  공통 요소에서 사용될 하이라이트 색상, 기본 패딩, 마진등의 속성을 포함하였습니다. (Holo와 DeviceDefault를 포함해서) 선택된 테마를 앱에 통합하기 위해 아래 예제처럼 테마 속성을 지정할 수 있습니다.

시스템 내장된 터치 하이라이트를 사용한 샘플 버튼

<ImageButton android:id="@+id/my_button"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:src="@drawable/button_icon"
    android:background="?android:attr/selectableItemBackground" />

시스템 테마의 값을 사용한 사용자 pressedHighLightColor 속성을 지닌 샘플 위젯

<MyWidget android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    myapp:pressedHighlightColor="?android:attr/colorPressedHighlight" />

시스템 제공된 미터법과 텍스트 외향을 사용한 열거 항목 배치 샘플

<LinearLayout android:layout_width="match_parent"
    android:layout_height="?android:attr/listPreferredItemHeight"
    android:paddingLeft="?android:attr/listPreferredItemPaddingLeft"
    android:paddingRight="?android:attr/listPreferredItemPaddingRight">
    <TextView android:id="@+id/text"
        android:textAppearance="?android:attr/textAppearanceListItem" />
    <!-- Other views here -->
</LinearLayout>

Theme.Holo.DarkActionBar
(API 레벨 14이상 가능)
옛날 앱을 위한 디폴트

만약 앱이 메니페스트에 명시적으로 테마를 정하지 않으면 안드로이드 4.0은 앱의 앱의 원래 기대치를 담고 있는 targetSdkVersion를 기초로 기본 테마를 결정합니다. 11보다 적으면 @android:style/Theme,11부터 13사이면 @android:style/Theme.Holo, 14 이상이면 @android:style/Theme.DeviceDefault입니다.

안드로이드 2.x을 지원하며 Holo 사용하기

기존 디바이스가 업데이트 되거나 새로운 디바이스가 출시될 동안 많은 안드로이드 개발자들은 2.x 버전 디바이스까지 지원하길 원합니다. 그렇다고 새로운 테마를 지원하는 디바이스에서 새로운 테마를 사용하는 이점을 포기할 수 없죠. 디바이스에 동작하는 플랫폼 버전에 기반해 자동으로 선택되는 테마를 안드로이드 리소스 시스템을 사용하여 만들 수 있습니다.

Theme.Holo와 Theme.Holo.Light는 API 레벨 11부터 사용가능하지만Theme.Holo.Light.DarkActionBar는 API 레벨 14에 추가되었습니다.

res/values/themes.xml

<resources>
    <style name="MyTheme" parent="@android:style/Theme">
        <!-- Any customizations for your app running on pre-3.0 devices here -->
    </style>
</resources>

res/values-v11/themes.xml

<resources>
    <style name="MyTheme" parent="@android:style/Theme.Holo">
        <!-- Any customizations for your app running on devices with Theme.Holo here -->
    </style>
</resources>

마지막으로 AndroidManifest.xml

<!-- [...] -->
    <application android:name="MyApplication"
            android:label="@string/application_label"
            android:icon="@drawable/app_icon"
            android:hardwareAccelerated="true"
            android:theme="@style/MyTheme">
<!-- [...] -->

이 아이디어가 맘에 든다면 당신의 리소스에 설정해 다른 값의 테마 속성을 만들 수 있습니다. 안드로이드 리소스 시스템에 대해 더 알고 싶으면 애플리케이션 리소스를 보세요.

끝으로

4.0 이상에서 동작하는 안드로이드 앱은 Holo 테마를 사용할 수 있습니다. 사용자 스킨을 가진 디바이스에서 앱을 돌릴 때에도 Holo의 룩 앤 필은 동일하게 보이는 것이 보장됩니다. 디바이스의 기본 스타일을 사용하고 싶은 앱은 이제 공개 API인 DeviceDefault 테마를 사용하면 됩니다. 이 변화는 어떤 디바이스에서 다른 디바이스로 갈 때의 걱정할 시간을 줄이고 더 많은 시간을 설계에 사용할 수 있게 합니다. 마지막으로 안드로이드 리소스 시스템은 오래된 디바이스를 위한 우아한 폴백을 제공하며 최신 플랫폼의 특성을 사용할 수 합니다. (주: 폴백은 새로운 기능이 동작하지 않은 구형 장비를 위해 대체 기능을 제공하는 것입니다.)

댓글 없음:

댓글 쓰기