안드로이드 위젯 개발은 생각만큼 개발하기 쉬운 것은 아닙니다.
감히 안드로이드 개발을 하면서 가장 지저분한(?) 아이템 중 하나라 감히 말씀드리고 싶네요.
언뜻 보기에는 그렇게 대단해 보이지 않는 녀석같지만, 기능을 하나하나 추가하다 보면, 의외로 난관에 부딪히는 경우가 많습니다.
일단, 그런 예외적인 상황들에 앞서, 개발자 사이트에서 제공해 주는 문서를 한 번 읽어보겠습니다.
https://developer.android.com/guide/topics/appwidgets?hl=ko
문서에서는 AppWidgetProviderInfo, AppWidgetProvider, 그리고, 초기 레이아웃 세 가지가 필요하다고 기술되어 있습니다.
이 중에서 가장 먼저 선행되어야하는 것은 WidgetInfo xml 파일과 APPWIDGET_UPDATE action 을 받을 수 있는 BroadcastReceiver 입니다.
1. AppWidetProviderInfo(Widget Info) 는 res/xml 디렉토리에 추가해주어야 하는 xml 파일입니다.
개발자 사이트 문서에는 더 많은 속성 값들과 설명들이 나열되어 있습니다. 이 중 가장 중요한 값은 아래에 기술된 minWidth, minHeight 값입니다. 이 두 개의 속성 값이 없을 경우, 위젯 추가 화면에 표시되지 않습니다.
<?xml version="1.0" encoding="utf-8"?>
<appwidget-provider
xmlns:android="http://schemas.android.com/apk/res/android"
android:minWidth="40dp"
android:minHeight="40dp">
</appwidget-provider>
2. 그리고, BroadcastReceiver 파일을 추가한 뒤, AndroidManifest.xml 파일에 정보를 추가해 줍니다.
여기까지 진행 하면 그림과 같이 기본 아이콘으로 설정된 1x1 위젯이 위젯 추가 화면에서 메뉴가 나오기 시작합니다.
class WidgetProvider : BroadcastReceiver() {
override fun onReceive(context: Context?, intent: Intent?) {
}
}
<receiver android:name=".WidgetProvider" >
<intent-filter>
<action android:name="android.appwidget.action.APPWIDGET_UPDATE" />
</intent-filter>
<meta-data
android:name="android.appwidget.provider"
android:resource="@xml/widget_info"/>
</receiver>
물론, 여기까지 추가할 경우, 실제 위젯을 홈 화면에 띄울 수 있는 것은 아닙니다.
코드만 놓고 보아도 표시할 기본 레이아웃이 지정되어 있지 않기 때문에, 위젯 추가 화면에 표시만 될 뿐, 추가할 수 있는 위젯은 없는 셈입니다.
개발자 문서와는 약간 다르게 구현한 이유는, 안드로이드라는 시스템이 위젯을 인식하기 위해서는 최소한 어떠한 값들이 있어야 하는가를 조금이나마 가늠해보기 위한 것입니다.
핵심은 AndroidManifest.xml 에 기술된 <receiver> 와 <meta-data> 태그 안의 resource 파일입니다.
또 이 resource 파일에서 가장 중요한 값은 minWidth 와 minHeight 라는 것입니다.
3. 마지막으로 BroadcastReceiver - onReceive() 에 AppWidgetManager 코드를 추가해 주시면, 홈스크린에 추가되는 위젯을 만들 수 있습니다.
class WidgetProvider : BroadcastReceiver() {
override fun onReceive(context: Context?, intent: Intent?) {
if(intent == null){
return
}
val widgetManager = AppWidgetManager.getInstance(context)
when (intent.action) {
AppWidgetManager.ACTION_APPWIDGET_UPDATE -> {
val remoteViews = RemoteViews(
"com.tistory.develop_branch.widget",
R.layout.widget_layout
)
intent.extras?.let {
val appWidgetIds: IntArray? =
intent.extras!!.getIntArray(AppWidgetManager.EXTRA_APPWIDGET_IDS)
appWidgetIds?.forEach {
widgetManager.updateAppWidget(it,remoteViews)
}
}
}
}
}
}
여기까지 진행된 소스는 여기를 참고하세요.
2020/03/10 - [Android/Widget] - 안드로이드 위젯 개발하기 (2)
'Android Widget' 카테고리의 다른 글
안드로이드 위젯 개발하기 (4) (0) | 2020.07.27 |
---|---|
안드로이드 위젯 개발하기 (3) (0) | 2020.03.13 |
안드로이드 위젯 개발하기 (2) (0) | 2020.03.10 |