안드로이드 젯팩 컴포즈 glance로 appwidget 개발
젯팩 컴포즈를 배운 뒤에 appwidget도 관련된 api가 있는지 찾아보았는데 있었다.
젯팩 컴포즈에선 glance라는 api를 사용한다.
glance를 사용하기 위해선 어떻게 해야하는지 알아보겠다.
먼저 모듈의 build.gradle.kts에 아래 의존성을 추가해준다.
implementation("androidx.glance:glance:1.0.0")
// For AppWidgets support
implementation("androidx.glance:glance-appwidget:1.0.0")
이외에도 wear tiles를 사용하려면(웨어 디바이스에 사용되는거 같다.) 다른 부분도 추가해야 한다.
아래 적당한 패키지에 아래 클래스들을 추가한다.
class ContactReceiver : GlanceAppWidgetReceiver() {
override val glanceAppWidget: GlanceAppWidget = ContactWidget()
}
GlanceAppWidgetReceiver 는 사실 AppWidgetProvider를 상속받아서 만들어졌다.
AppWidgetProvider 에서 했던 작업을 여기서 해도 될 것이다.
class ContactWidget : GlanceAppWidget() {
override suspend fun provideGlance(context: Context, id: GlanceId) {
// Load data needed to render the AppWidget.
// Use `withContext` to switch to another thread for long running
// operations.
provideContent {
// create your AppWidget here
Contact()
}
}
@Composable
private fun Contact() {
val context = LocalContext.current
Button(
text = context.getString(R.string.contacts),
style = TextStyle(
fontWeight = FontWeight.Bold,
fontSize = 70.sp,
textAlign = TextAlign.Center
),
modifier = GlanceModifier.fillMaxSize().padding(0),
onClick = actionStartActivity<MainActivity>()
)
}
}
Contact 컴포저블이 위젯으로 보여지는 부분이다.
이 부분을 수정해서 레이아웃을 설정할 수 있다.
stringResource는 젯팩 컴포즈의 컴포저블에서만 동작하는데 glance는 고유의 컴포저블을 사용한다.
때문에 stringResource를 사용하자 오류가 발생했다.
임포트할때도 glance와 관련된 항목인지 확인하고 해야한다.
stringResource대신 context.getString을 사용하면 된다.
매니페스트에 아래 항목을 추가해준다.
<receiver android:name=".glance.ContactReceiver" android:exported="true">
<intent-filter>
<action android:name="android.appwidget.action.APPWIDGET_UPDATE" />
</intent-filter>
<meta-data android:name="android.appwidget.provider" android:resource="@xml/contact_app_widget_info" />
</receiver>
res의 xml 폴더의 contact_app_widget_info.xml에 아래 항목을 작성해준다.
<appwidget-provider xmlns:android="http://schemas.android.com/apk/res/android"
android:minWidth="250dp"
android:minHeight="40dp"
android:updatePeriodMillis="86400000"
android:initialLayout="@layout/glance_default_loading_layout">
</appwidget-provider>
어차피 glance로 레이아웃을 출력할 것이라 initialLayout은 glance기본 레이아웃을 이용했다.
minHeight minWidth가 위젯의 크기가 되는데 이건 1X4칸이다
N칸의 크기는 70*N-30 dp이다.
1->40dp
2->110dp
3->180dp
4->250dp