AppCompat 包破坏Launcher Widget ,导致couldn't find any view, using error view

使用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的解决方式

    重新运行项目,效果如下:

    这里写图片描述

  • 3
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值