젯팩 컴포즈를 배운 뒤에 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