- Glance에서는 일반 Compose와는 다르게 Glance 전용 패키지로 UI 구성 요소를 제공한다.
import androidx.glance.GlanceId
import androidx.glance.GlanceModifier
import androidx.glance.Image
import androidx.glance.ImageProvider
import androidx.glance.LocalContext
import androidx.glance.action.Action
import androidx.glance.action.clickable
import androidx.glance.appwidget.GlanceAppWidget
import androidx.glance.appwidget.GlanceAppWidgetManager
import androidx.glance.appwidget.action.actionStartActivity
import androidx.glance.appwidget.cornerRadius
import androidx.glance.appwidget.provideContent
import androidx.glance.background
import androidx.glance.layout.Alignment
import androidx.glance.layout.Box
import androidx.glance.layout.Column
import androidx.glance.layout.Row
import androidx.glance.layout.Spacer
- 이는 Compose처럼 구성하지만 실제로는 RemoteViews를 준비하는 구조가 형성되어 있기 때문이다.
- Modifier의 경우에도 GlanceModifier를 사용해야 하는데, 일반 Modifier보다는 제한 사항이 좀 있다.
- 예를 들어, weight 같은 경우에는 defaultWeight()를 통해 균등 배분을 구현해야 한다.
val weightModifier = GlanceModifier.defaultWeight()
- 또한 Glance에서는 colorResource()나 dimenResource() 같은 리소스 접근 함수 사용을 못한다.
- 그래서 치수 같은 경우에는 dp, sp를 직접 입력해 주거나 object로 정리해서 사용했다. -> 혹시 틀렸다면 알려주세요.
- Color와 Image 같은 경우에는 ColorProvider, ImageProvider를 사용해야 한다.
style = TextStyle(
fontSize = 16.sp,
color = ColorProvider(R.color.color_system_label_subtler_light)
)
Image(
provider = ImageProvider(iconId),
contentDescription = label,
modifier = GlanceModifier.size(28.dp)
)
- resource id만 넘겨주면 된다.
- 그리고 위젯 UI 구성 후 다음 빌드에서 곧바로 위젯이 보이지 않고 위젯을 표시할 수 없음이라고 뜰 수 있다.
- 기존 RemoteViews와는 다르게 자동으로 위젯이 업데이트되는 것이 아니라서 수동으로 위젯 업데이트 함수를 만들어 앱이 열릴 때 호출해 주도록 구성했다.
fun updateQuickActionWidget(context: Context) {
val manager = GlanceAppWidgetManager(context)
CoroutineScope(Dispatchers.IO).launch {
val glanceIds = manager.getGlanceIds(QuickActionWidget::class.java)
glanceIds.forEach { glanceId ->
QuickActionWidget().update(context, glanceId)
}
}
}
- Glance는 RemoteViews와 다르게 컴파일 타임에 RemoteViews를 미리 만들지 않기 때문에 위와 같은 로직이 필요하다.
- 애초에 Compose를 RemoteViews로 전환하는 과정이 런타임에서만 진행된다.