이전 글 :  2020/03/09 - [Android/Widget] - 안드로이드 위젯 개발하기 (1)

 

이전 글에서는 가장 기초적인 내용에 대해서만 기술했습니다.
이 글에서는 위젯 개발에서 WidgetInfo 에 대해서만, 좀 더 깊숙히 들어가 보도록 하겠습니다.

이전 글에서 WidgetInfo 가 가지는 속성 값 중 가장 중요한 값은 minWidth 와 minHeight 였습니다.
안드로이드는 이 값을 기준으로 위젯의 크기가 1x1 사이즈인지 2x2 사이즈인지를 구별합니다.
기준이 되는 값은 아래와 같습니다. (출처 : 앱 위젯 디자인 가이드 라인)

셀 개수(열 또는 행) 사용 가능한 크기(dp)(minWidth 또는 minHeight)
1 40dp
2 110dp
3 180dp
4 250dp
n 70 × n − 30

이런 식으로 min 값만을 제공하는 이유는 단말마다 홈 크린에서 제공할 수 있는 1x1 위젯의 공간 크기가 제각각 다르기 때문입니다.
그래서, 시스템이 보장해줄 수 있는 최소 값을 제공하고, 그에 따라 위젯 레이아웃을 구성하도록 하는 것입니다.
1x1 위젯의 최소값은 40dp-40dp 이지만, 실제로 대부분의 안드로이드 단말들은 1개의 셀당 크기가 이보다 큰 것이 일반적입니다.

홈 화면에서 셀당 크기를 변경할 수도 있습니다.

 

그럼, 이제 각각의 속성 값에 대해서 좀 더 자세히 알아보도록 하겠습니다.

<appwidget-provider xmlns:android="http://schemas.android.com/apk/res/android"
	android:minWidth="40dp"
	android:minHeight="40dp"
	android:updatePeriodMillis="86400000"
	android:previewImage="@drawable/preview"
	android:initialLayout="@layout/example_appwidget"
	android:configure="com.example.android.ExampleAppWidgetConfigure"
	android:resizeMode="horizontal|vertical"
	/>

updatePeriodMillis
: 위젯은 매우 수동적인 녀석입니다. 시스템에서 어쩌다 한 번씩 '업데이트 하라구!!!' 라는 메시지를 주어야 그제서야 위젯을 업데이트 합니다. 이 값은 '업데이트 하라구!!!' 라는 메시지를 얼마나 자주 보내주는지에 대한 것입니다. 예제에도 있지만, 보통 24시간(=86400초) 정도로 업데이트 할 것을 예상하고 만든 것으로 보입니다. (아마도 구글 형님들은 그런 의도로 만들었을 거라는 제 추측입니다. )
위젯 업데이트가 배터리 소모에 상당한 영향을 준다는 얘기도 있었고, 개발자 문서에서는 30분내에는 두 번이상 메시지를 보내지 않는다고 기술되어 있습니다. 즉, 최소값이 30분이라는 것으로 판단됩니다만, 위젯 업데이트 시간에 대해 구현을 진행하다 보면 보통 이런 업데이트 주기에 상관없이 앱에서 위젯을 업데이트하기 때문에 값을 별로 신경쓰지 않게 됩니다.

initialLayout
: 초기 레이아웃 값입니다. 보통 AppWidgetManger 로 RemoteView 를 업데이트 해주면 별 상관없는 값이긴 합니다만, 부팅 직후 처럼 아직 업데이트가 진행되지 않은 상황에서 위젯에 "Problem loading widget" 와 같은 메시지가 표시되는 것을 방지해줍니다.
보통 실제 데이터와 거의 유사한 화면을 추가해 놓는데, (그렇게 해 놓는 것이 예쁘긴 합니다.) 이 초기 화면을 너무 실제와 비슷하면, 간혹 개발 중에 오류가 발생하더라도 실수로 지나치는 경우가 종종 발생합니다.

previewImage
: 설정하지 않을 경우, 이전 글에 포함되어 있는 그림 처럼 기본 런처 아이콘이 사용됩니다.

configure
: 위젯 설정 Activity 를 지정(?) 할 수 있습니다. 보통 위젯을 홈 화면에 설치하기 직전에 나오는 설정 화면입니다.
이 설정 Activity 에 대해서는 후속 글에서 더 이야기 할 것들이 있습니다.

resizeMode
: 위젯을 상하좌우로 늘릴 수 있는지 옵션을 설정해 주는 속성입니다.
위에서 기술했다 시피 최소값을 기준으로 위젯을 만들기는 하지만, 대부분 이 최소값보다는 큰 사이즈를 감안해서 위젯을 만들게 됩니다.
그런 관점에서 2x2 위젯을 4x4 로 늘린다고 크게 문제 없도록 상대적인 값으로 잘 디자인한다면, 사용자 입장에서 꽤나 괜찮은 옵션일 것입니다.

 

덧붙임 1.

WidgetInfo 의 minWidth, minHeight 값만으로는 부족함을 많이 느낄 때가 많습니다.

상대적인 레이아웃의 배치를 고려한다고 하더라도, 위젯의 크기가 실제로 어느 정도 되는것인지 가늠이 되지 않기 때문입니다.

fun getWidgetSize(context : Context, appWidgetId : Int){
	val manager = AppWidgetManager.getInstance(context)
	val options = manager.getAppWidgetOptions(appWidgetId)
	val minWidth = options.getInt("appWidgetMinWidth") // dp
	val minHeight = options.getInt("appWidgetMinHeight") // dp
	val maxWidth = options.getInt("appWidgetMaxWidth") // dp
	val maxHeight = options.getInt("appWidgetMaxHeight") // dp
}

코드상에서는 Context 와 appWidgetId(Int) 값만 있으면, 아래 코드를 통해 위젯의 실제 사이즈를 가늠해 볼 수 있습니다.

비록 실제적인 값은 아니지만, min/max 값으로 Preview 화면을 미리 가늠해 볼 수 있기 때문입니다.

위젯 개발 혹은 디자인이 까다로운 이유는 이런 레이아웃의 width, height 값을 가늠하기만 할 뿐, 특정하기가 어렵기 때문입니다.

 

덧붙임 2.

WidgetInfo 파일에서 minWidth/minHeight = 40dp 혹은 110dp 가 아니라 70dp 로 설정하면 어떻게 될까요?

어떤 단말에서는 1x1 으로 나올 수도 있지만, 어떤 단말에서는 2x2 으로 또 어떤 단말에서는 1x2 로 나올 수도 있습니다.

그렇기 때문에, 위 개발자 문서에서 가이드한 40/110/.../70xN-30 의 값은 NxM 위젯이라는 것을 정의하는 수준일 뿐,

실제 위젯 뷰의 사이즈를 확정하기도 어렵습니다.

'Android Widget' 카테고리의 다른 글

안드로이드 위젯 개발하기 (4)  (0) 2020.07.27
안드로이드 위젯 개발하기 (3)  (0) 2020.03.13
안드로이드 위젯 개발하기 (1)  (0) 2020.03.09