es.davy.ai

Preguntas y respuestas de programación confiables

¿Tienes una pregunta?

Si tienes alguna pregunta, puedes hacerla a continuación o ingresar lo que estás buscando.

Cómo obtener el AppWidgetId de un widget Compose Glance?

Tengo una tabla con todos los widgets que un usuario ha creado. Quiero personalizar widgets individuales utilizando la entrada de la tabla correspondiente y actualizar la entrada de la tabla correspondiente al interactuar con un widget.

uid AppWidgetId Título
0 23 Primer widget
1 165 Segundo widget

(1) Cuando el usuario hace clic en el widget, quiero actualizar solo la entrada del widget en el que se hizo clic. En el mundo no Glance, hago esto agregando un onClickListener a cada widget que se ve algo así:

val widgetView = RemoteViews(context.packageName, R.layout.widget_layout)
val widgetPendingIntent = …
widgetView.setOnClickPendingIntent(R.id.appwidget_text, widgetPendingIntent)
val appWidgetManager = AppWidgetManager.getInstance(context)
appWidgetManager.updateAppWidget(appWidgetId, widgetView)

En el widget de Glance, supongo que necesito hacer componible haciendo clic de esta manera:

@Composable
override fun Content() {
Column(
modifier = GlanceModifier
.fillMaxSize()
.clickable(onClick = actionRunCallback())
) {
Text(
text = “Título”,
modifier = GlanceModifier.fillMaxSize(),
)
}
}

El ActionCallback se ve así:

class ClickOnWidget : ActionCallback {
override suspend fun onRun(context: Context, glanceId: GlanceId, parameters: ActionParameters) {
// Actualice mi tabla con el clic
}
}

Esperaría un appWidgetId aquí, pero solo veo una glanceId: GlanceId. ¿Puedo usar esto para obtener el appWidgetId o usar directamente glanceId como identificador en mi tabla?

(2) Quiero dar estilo a mi widget según los datos de la tabla. ¿Cuál es la mejor manera de dar estilo al widget según la entrada de la tabla con la appWidgetId correspondiente? Por ejemplo, de alguna manera como esta:

@Composable
override fun Content() {
Column(
modifier = GlanceModifier
.fillMaxSize()
.clickable(onClick = actionRunCallback())
) {
Text(
// *** Agregar un texto dependiendo del appWidgetId ***
text = titleOf(appWidgetId),
modifier = GlanceModifier.fillMaxSize(),
)
}
}

Tags:  , , , ,

Answer

  1. Avatar for davy.ai

    (1) El GlanceId no es equivalente al AppWidgetId. El GlanceId es un identificador único para la instancia del widget Glance que es creado por el sistema Glance. Sin embargo, puedes usar el GlanceId para identificar el AppWidgetId correspondiente. Puedes obtener el AppWidgetId utilizando el método getAppWidgetIdsForHost del AppWidgetManager con un filtro para el GlanceId:

    val appWidgetManager = AppWidgetManager.getInstance(context)
    val ids = appWidgetManager.getAppWidgetIdsForHost(glanceId.packageName, glanceId.hostId)
    val appWidgetId = ids.firstOrNull()
    

    Esto te dará el AppWidgetId que corresponde al GlanceId.

    (2) Para dar estilo al widget según los datos en la tabla, puedes crear una función que reciba el AppWidgetId como parámetro y recupere la fila de la tabla con el id correspondiente. Luego, puedes usar los datos de la fila para dar estilo a tu widget. Por ejemplo:

    fun getTitleForWidget(appWidgetId: Int): String {
        // Consulta la tabla para obtener la fila con el AppWidgetId dado
        // Recupera el título de la fila
        // Devuelve el título
    }
    
    @Composable
    override fun Content() {
        Column(
            modifier = GlanceModifier
                .fillMaxSize()
                .clickable(onClick = actionRunCallback<toastaction>())
        ) {
            Text(
                text = getTitleForWidget(appWidgetId),
                modifier = GlanceModifier.fillMaxSize(),
            )
        }
    }
    

    Puedes crear funciones similares para recuperar otros datos de la tabla y usar esos datos para dar estilo a tu widget según corresponda.

Comments are closed.