DEV Community

myougaTheAxo
myougaTheAxo

Posted on

Glance Widget Advanced: Custom UI, WorkManager & Size-Responsive Layouts

Glance Widget Advanced: Custom UI, WorkManager & Size-Responsive Layouts

Glance simplifies widget development with Compose-like API. Advanced techniques include responsive layouts, custom UI components, and background updates.

Size-Responsive Layout

@Composable
fun ResponsiveWidget() {
    val size = LocalSize.current

    when {
        size.width < 120.dp -> SmallLayout()
        size.width < 200.dp -> MediumLayout()
        else -> LargeLayout()
    }
}

@Composable
fun SmallLayout() {
    Column(modifier = GlanceModifier.fillMaxSize().padding(8.dp)) {
        Text("Compact")
    }
}

@Composable
fun LargeLayout() {
    Row(modifier = GlanceModifier.fillMaxSize().padding(12.dp)) {
        Column(modifier = GlanceModifier.defaultWeight()) {
            Text("Large Widget")
        }
    }
}
Enter fullscreen mode Exit fullscreen mode

WorkManager Integration

class WidgetUpdateWorker(context: Context, params: WorkerParameters) : Worker(context, params) {
    override fun doWork(): Result {
        // Fetch data
        val data = fetchLatestData()

        // Update widget state
        GlanceAppWidgetManager(applicationContext).updateAppWidget(MyWidget::class.java)
        return Result.success()
    }
}

// Schedule periodic updates
fun scheduleWidgetUpdates() {
    val updateWork = PeriodicWorkRequestBuilder<WidgetUpdateWorker>(
        30, TimeUnit.MINUTES
    ).build()

    WorkManager.getInstance(context).enqueueUniquePeriodicWork(
        "widget_update",
        ExistingPeriodicWorkPolicy.KEEP,
        updateWork
    )
}
Enter fullscreen mode Exit fullscreen mode

Custom Clickable Areas

@Composable
fun InteractiveWidget() {
    Column(
        modifier = GlanceModifier.fillMaxSize().clickable(
            onClick = ActionStartActivity(MainActivity::class.java)
        )
    ) {
        Text("Click me!")
    }
}
Enter fullscreen mode Exit fullscreen mode

Data Persistence with GlanceStateDefinition

class MyWidgetStateDefinition : GlanceStateDefinition<MyWidgetState> {
    override suspend fun getState(context: Context): MyWidgetState {
        // Load from preferences or database
        return MyWidgetState(data = "loaded")
    }

    override suspend fun updateState(context: Context, state: MyWidgetState) {
        // Save state
    }
}
Enter fullscreen mode Exit fullscreen mode

Glance widgets provide modern, reactive UI with minimal boilerplate. Combine with WorkManager for reliable background updates.


8 Android app templates available on Gumroad

Top comments (0)