如何在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
相关产品推荐
相关产品推荐

