使用App Widget Host添加Widget,导致问题android.support.v7.widget.AppCompatImageView can't use method with RemoteViews: setImageResource(int)
。
运行项目后,跳转到选择Widget界面中,选择Play商店的widget,如下图所示 。
配置界面返回数据后,添加widget到布局中,突然报错,如下图所示。
这时候,查看日志和异常了解情况。
log步骤走向:
08-01 01:45:39.354 21467-21467/com.xingen.appwidgethost I/MainActivity: selectWidget() 开始转入选择界面
08-01 01:45:41.921 21467-21467/com.xingen.appwidgethost I/MainActivity: configureWidget 开启配置界面
08-01 01:45:41.986 21467-21467/com.xingen.appwidgethost I/MainActivity: createWidget 正在添加widget到布局中
异常提示:
AppWidgetHostView: updateAppWidget couldn't find any view, using error view
android.widget.RemoteViews$ActionException: view:
android.support.v7.widget.AppCompatImageView
can't use method with RemoteViews: setImageResource(int)
at android.widget.RemoteViews.getMethod(RemoteViews.java:855)
at android.widget.RemoteViews.-wrap5(RemoteViews.java)
at android.widget.RemoteViews$ReflectionAction.apply(RemoteViews.java:1410)
at android.widget.RemoteViews.performApply(RemoteViews.java:3428)
at android.widget.RemoteViews.apply(RemoteViews.java:3165)
at android.appwidget.AppWidgetHostView.applyRemoteViews(AppWidgetHostView.java:451)
at android.appwidget.AppWidgetHostView.updateAppWidget(AppWidgetHostView.java:380)
at android.appwidget.AppWidgetHost.createView(AppWidgetHost.java:353)
这是一个神奇的问题,选择某些widget会报错,某些widget不会报错。
寻找解决方式
度娘答案(差强人意):
原由:
根据android.support.v7.widget.AppCompatImageView 的介绍,在appcompat-v7(23.1.0)版本中是 失去了这个注解: @android.view.RemotableViewMethod for the following methods:setImageResource(int)、setBackgroundResource(int)
解决方式:设置
appcompat version to ‘com.android.support:appcompat-v7:23.0.1’
或者更低版本。Google大法的答案(完美解决):
在StackoverFlow上找到一个帖子,将Activity的context替换成程序的Context(即getApplicationContext())。
/** * 初始化appWidgetHost */ fun initAppWidgetHost() { this.mAppWidgetManager = AppWidgetManager.getInstance(applicationContext) /** * AppWidgetHost提供appwidget 服务与app交互。 * 例如:home screen嵌入widget. */ this.mAppWidgetHost = AppWidgetHost(applicationContext, R.id.APPWIDGET_HOST_ID) } /** * 创建widget,且添加到布局。 */ fun createWidget(data: Intent?){ //.......省略部分代码 var hostView=this.mAppWidgetHost?.createView(applicationContext,appWidgetId,appWidgetInfo) }
来源于,StackoverFlow的解决方式。
重新运行项目,效果如下: