触发 Widget 布局的 Android 10 主题更新

Tyk*_*kin 6 android android-widget kotlin android-dark-theme

随着 Android 10 的发布,多个小部件(Gmail、Google 新闻、三星电子邮件)现在会在切换深色模式时更新其主题。我正在尝试复制这种行为。我有一个带有 AppWidgetProvider 和 RemoteViewsFactory 的列表视图小部件。但是,当切换深色模式时,ListView 项目会切换到深色主题,而不是布局本身:

深色模式关闭:

深色模式关闭

深色模式开启:

深色模式开启

在我的代码中,我在 AppWidgetProvider 的 OnUpdate() 方法中设置布局:

    override fun onUpdate(
    context: Context,
    appWidgetManager: AppWidgetManager?,
    appWidgetIds: IntArray?
) {

    Log.d(TAG, "Updating Transaction Widget")

    GlobalScope.launch(Dispatchers.IO ) {
        updateTransactionTable(context)
        for (i in appWidgetIds!!.indices) {
            val layout: RemoteViews = buildLayout(context, appWidgetIds[i])
            appWidgetManager!!.updateAppWidget(appWidgetIds[i], layout)
        }
        super.onUpdate(context, appWidgetManager, appWidgetIds)
    }
}
Run Code Online (Sandbox Code Playgroud)

切换暗模式时不会调用 onUpdate。但是,当切换暗模式时,我似乎找不到在 AppWidgetProvider 中调用的任何方法,因此我不确定在哪里调用新的布局构建,甚至不知道如何检测何时需要更改。

任何帮助将非常感激。

jma*_*art 0

事实上,当用户更改设备主题时,Android 系统不会调用小部件提供程序上的任何方法。

系统所做的就是在“-night”资源文件夹中查找资产的深色变体。

因此,解决方案是为浅色和深色变体创建不同的资产。例如:

  • 轻资产:“layout”资源文件夹中带有浅色背景的“widget_layout.xml”。
  • 深色资源:“layout-night”资源文件夹中带有深色背景的“widget_layout.xml”。

请记住,也可以为可绘制对象和其他资源文件创建“-night”变体,因此根据情况,可能不需要复制整个布局(例如,我使用可绘制对象作为背景,我只是需要为该可绘制对象创建一个“-night”变体)。