如何获取 Compose Glance 小部件的 AppWidgetId?

Posted

技术标签:

【中文标题】如何获取 Compose Glance 小部件的 AppWidgetId?【英文标题】:How to get the AppWidgetId of a Compose Glance widget? 【发布时间】:2022-01-21 01:31:09 【问题描述】:

我有一个包含用户创建的所有小部件的表格。我想使用相应的表格条目自定义各个小部件,并在与小部件交互时更新相应的表格条目。

uid AppWidgetId Title
0 23 First widget
1 165 Second widget

(1) 当用户点击小部件时,我只想更新被点击的小部件的条目。在非 Glance 世界中,我通过向每个小部件添加一个 onClickListener 来做到这一点,看起来有点像这样:

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)

在 Glance 小部件中,我假设我需要像这样使可组合可点击:

    @Composable
    override fun Content() 
        Column(
            modifier = GlanceModifier
                .fillMaxSize()
                .clickable(onClick = actionRunCallback<ClickOnWidget>())
        ) 
            Text(
                text = "Title",
                modifier = GlanceModifier.fillMaxSize(),
            )
        
    

ActionCallback 如下所示:

class ClickOnWidget : ActionCallback 
    override suspend fun onRun(context: Context, glanceId: GlanceId, parameters: ActionParameters) 
       // Update my table with the click
    

我希望这里有一个 appWidgetId,但只看到一个glanceId:GlanceId。我可以使用它来获取 appWidgetId 还是直接使用glanceId作为我的表中的标识符?

(2) 我想根据表格中的数据设置我的小部件的样式。根据具有相应 appWidgetId 的表条目设置小部件样式的最佳方法是什么?例如。有点像这样:

    @Composable
    override fun Content() 
        Column(
            modifier = GlanceModifier
                .fillMaxSize()
                .clickable(onClick = actionRunCallback<ToastAction>())
        ) 
            Text(
                // *** Add a text depending on the appWidgetId ***
                text = titleOf(appWidgetId),
                modifier = GlanceModifier.fillMaxSize(),
            )
        
    

【问题讨论】:

【参考方案1】:

您无法获取 AppWidgetId,这是设计使然。

对于您的用例,我们建议您在每次创建新的 App Widget 时创建自己的稳定 ID。您将将该 ID 存储在附加到 App Widget 的状态中,并使用它将其链接到您的一些数据(您之前存储 AppWidgetId 的位置)。这种间接的原因是我们打算处理备份和恢复,但 AppWidget ID 在此过程中会发生变化,因此在您自己的数据结构中依赖它们并不是一个很好的方法。

要实现这一点,您可能需要查看 GlanceAppWidget.stateDefinitionPreferencesGlanceStateDefinitionLocalStateGlanceAppWidget.updateAppWidgetState

【讨论】:

以上是关于如何获取 Compose Glance 小部件的 AppWidgetId?的主要内容,如果未能解决你的问题,请参考以下文章

Jetpack Glance?小部件的春天来了

如何在 Jetpack Compose 中使用小部件?

Apple Watch Glance 将如何显示

如何在一个页面中多次组合相同的小部件

在子小部件中,如何在 kivy 中获取父小部件的实例

Android小部件如何从中获取小时和分钟的时间?