Kar*_*rim 2 android android-widget android-jetpack-compose glance glance-appwidget
我有一个表,其中包含用户创建的所有小部件。我想使用相应的表条目自定义各个小部件,并在与小部件交互时更新相应的表条目。
uid | 应用程序小部件ID | 标题 |
---|---|---|
0 | 23 | 第一个小部件 |
1 | 165 | 第二个小部件 |
(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)
Run Code Online (Sandbox Code Playgroud)
在概览小部件中,我假设我需要使可组合项可单击,如下所示:
@Composable
override fun Content() {
Column(
modifier = GlanceModifier
.fillMaxSize()
.clickable(onClick = actionRunCallback<ClickOnWidget>())
) {
Text(
text = "Title",
modifier = GlanceModifier.fillMaxSize(),
)
}
}
Run Code Online (Sandbox Code Playgroud)
ActionCallback 看起来像这样:
class ClickOnWidget : ActionCallback {
override suspend fun onRun(context: Context, glanceId: GlanceId, parameters: ActionParameters) {
// Update my table with the click
}
}
Run Code Online (Sandbox Code Playgroud)
我期望这里有一个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(),
)
}
}
Run Code Online (Sandbox Code Playgroud)
您无法获取 AppWidgetId,这是设计使然。
对于您的用例,我们建议每次创建新的应用程序小部件时创建您自己的稳定 ID。您将将该 ID 存储在附加到 App Widget 的状态中,并使用它来将其链接到您的某些数据(您之前存储 AppWidgetId 的位置)。这种间接的原因是我们打算处理备份和恢复,但 AppWidget ID 在此过程中发生变化,因此在您自己的数据结构中依赖它们并不是一个很好的方法。
要实现这一点,您可能需要查看GlanceAppWidget.stateDefinition
、PreferencesGlanceStateDefinition
和。LocalState
GlanceAppWidget.updateAppWidgetState