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

Android Widget中如何为RemoteViews应用View Binding

在App Widget的RemoteViews中使用View Binding的说明

需要明确的是,RemoteViews 并不支持直接使用 View Binding。原因在于,View Binding生成的绑定类是直接持有当前进程内View实例的引用,而RemoteViews的工作机制是通过跨进程通信,向App Widget所在的系统进程发送操作指令(比如设置文本、修改可见性),它不允许直接获取或操作目标View的实例,因此绑定类无法在这里发挥作用。

不过你可以通过以下方式优化代码,达到类似View Binding的类型安全、减少硬编码ID错误的效果:

方案1:定义ID常量类

把布局中的View ID统一封装到一个常量类里,避免直接硬编码ID:

object WidgetViewIds {
    const val textViewWidgetId = R.id.textViewWidgetId
    const val appwidgetUpdate = R.id.appwidget_update
}

使用时直接引用常量:

// 构建RemoteViews对象
val views = RemoteViews(context.packageName, R.layout.name_of_layout)
views.setTextViewText(WidgetViewIds.textViewWidgetId, appWidgetId.toString())
views.setTextViewText(WidgetViewIds.appwidgetUpdate, context.resources.getString(R.string.date_count_format, count, dateString))

方案2:封装RemoteViews操作工具类

自己封装一个工具类,把RemoteViews的操作方法统一管理,模拟View Binding的调用体验:

class WidgetRemoteViews(private val remoteViews: RemoteViews) {
    fun setTextViewWidgetIdText(text: String) {
        remoteViews.setTextViewText(R.id.textViewWidgetId, text)
    }

    fun setAppwidgetUpdateText(text: String) {
        remoteViews.setTextViewText(R.id.appwidget_update, text)
    }
}

使用方式:

val views = RemoteViews(context.packageName, R.layout.name_of_layout)
val widgetBinding = WidgetRemoteViews(views)
widgetBinding.setTextViewWidgetIdText(appWidgetId.toString())
widgetBinding.setAppwidgetUpdateText(context.resources.getString(R.string.date_count_format, count, dateString))

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.31 21:20:23