You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在Kotlin AppWidget中使用Glide加载远程图片?

Kotlin中使用Glide为AppWidget加载远程图片

我最近在做AppWidget开发时,也遇到了一模一样的问题——全网搜遍了Kotlin用Glide加载图片的案例,全都是针对普通ImageView的,完全找不到适配AppWidget的Kotlin示例。后来找到一篇Java版本的教程,我把它翻译成了可直接复用的Kotlin版本,亲测有效,分享给大家:

第一步:添加必要依赖

首先确保你的项目里引入了Glide核心库以及AppWidget集成扩展:

// Glide核心库
implementation 'com.github.bumptech.glide:glide:4.16.0'
kapt 'com.github.bumptech.glide:compiler:4.16.0'
// AppWidget集成专属扩展
implementation 'com.github.bumptech.glide:appwidget-integration:4.16.0'

第二步:在AppWidgetProvider中实现加载逻辑

核心是利用Glide提供的AppWidgetTarget来桥接远程图片和AppWidget的RemoteViews,代码如下:

class MyWidgetProvider : AppWidgetProvider() {

    override fun onUpdate(
        context: Context,
        appWidgetManager: AppWidgetManager,
        appWidgetIds: IntArray
    ) {
        // 遍历所有需要更新的AppWidget实例
        appWidgetIds.forEach { widgetId ->
            updateSingleWidget(context, appWidgetManager, widgetId)
        }
    }

    private fun updateSingleWidget(
        context: Context,
        appWidgetManager: AppWidgetManager,
        widgetId: Int
    ) {
        // 1. 初始化AppWidget的RemoteViews
        val remoteViews = RemoteViews(context.packageName, R.layout.layout_my_widget)

        // 2. 创建AppWidgetTarget,指定要更新的ImageView和RemoteViews
        val widgetImageTarget = object : AppWidgetTarget(
            context,
            R.id.iv_widget_image, // 替换成你布局里ImageView的实际ID
            remoteViews,
            widgetId
        ) {
            override fun onResourceReady(resource: Drawable, transition: Transition<in Drawable>?) {
                super.onResourceReady(resource, transition)
                // 关键:图片加载完成后必须手动调用updateAppWidget刷新界面
                appWidgetManager.updateAppWidget(widgetId, remoteViews)
            }
        }

        // 3. 用Glide加载远程图片到目标
        Glide.with(context)
            .asDrawable()
            .load("https://your-image-url.com/remote-image.jpg") // 替换成你的远程图片地址
            .placeholder(R.drawable.ic_placeholder) // 可选:加载中的占位图
            .error(R.drawable.ic_load_error) // 可选:加载失败的错误图
            .into(widgetImageTarget)

        // 先更新一次界面(比如先显示占位图)
        appWidgetManager.updateAppWidget(widgetId, remoteViews)
    }
}

关键注意点

  • 别忘了在AndroidManifest.xml中添加网络权限:<uses-permission android:name="android.permission.INTERNET" />
  • AppWidget的布局里必须使用标准的ImageView,自定义ImageView可能无法被Glide正确识别
  • 由于AppWidget运行在系统进程中,Glide的加载是异步的,所以必须在onResourceReady回调里手动触发AppWidget更新,否则加载完成后图片不会显示
  • 如果需要缓存优化,可以给Glide添加缓存策略,比如.diskCacheStrategy(DiskCacheStrategy.ALL)

内容的提问来源于stack exchange,提问作者Elletlar

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.25 06:24:24