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

