Android appwidget remoteviews没有更新

Posted

技术标签:

【中文标题】Android appwidget remoteviews没有更新【英文标题】:Android appwidget remoteviews not updating 【发布时间】:2013-08-09 19:20:25 【问题描述】:

当我从某个活动更新小部件时,列表远程视图没有更新(我的意思是刷新自身)。它出现在应用小部件的 onUpdate (显示日志)。但不会进入列表视图的适配器以使用新数据对其进行膨胀。

public void onUpdate(Context context, AppWidgetManager appWidgetManager,

int[] appWidgetIds) 
    final int N = appWidgetIds.length;
    for (int i = 0; i < N; i++) 
        int appWidgetId = appWidgetIds[i];

        Log.e("called", "onupdate");

        RemoteViews views = new RemoteViews(context.getPackageName(),
                R.layout.widget_lay);

        views.setTextViewText(R.id.textView1,
                "Floating Text will be displayed here .. Daily Thoughts");

        Intent intent = new Intent(context, RemoteServiceEmin.class);
        intent.putExtra(AppWidgetManager.EXTRA_APPWIDGET_ID, appWidgetId);
        views.setRemoteAdapter(R.id.gridview, intent);

        // inflating list remote view

        Intent intentlist = new Intent(context, ListInflater.class);
        intentlist.putExtra(AppWidgetManager.EXTRA_APPWIDGET_ID,
                appWidgetId);
        intent.setData(Uri.parse(intent.toUri(Intent.URI_INTENT_SCHEME)));
        views.setRemoteAdapter(R.id.listview, intentlist);

        // setting onclick on gridview
        Intent itemClickIntent = new Intent(context, MyWidgetProvider.class);
        itemClickIntent.setAction(ITEM_CLICK_ACTION);
        itemClickIntent.putExtra(AppWidgetManager.EXTRA_APPWIDGET_ID,
                appWidgetIds[i]);
        PendingIntent itemClickPendingIntent = PendingIntent.getBroadcast(
                context, 0, itemClickIntent,
                PendingIntent.FLAG_UPDATE_CURRENT);
        views.setPendingIntentTemplate(R.id.gridview,
                itemClickPendingIntent);

        appWidgetManager.updateAppWidget(appWidgetId, views);
    
    super.onUpdate(context, appWidgetManager, appWidgetIds);


【问题讨论】:

【参考方案1】:

所以终于完成了,再次感谢 developer.android.com 。您需要做的就是,从您要处理“更新”的位置触发广播意图。

Intent initialUpdateIntent = new Intent(
                AppWidgetManager.ACTION_APPWIDGET_UPDATE);
        initialUpdateIntent
                .setAction(AppWidgetManager.ACTION_APPWIDGET_UPDATE);
        sendBroadcast(initialUpdateIntent);

然后在 Appwidget 的 onRecieve 中捕获它,并使用

更新 Remoteview
 notifyAppWidgetViewDataChanged(). 

类似于coden-pbelow

 else if (intent.getAction().equals(
            AppWidgetManager.ACTION_APPWIDGET_UPDATE)) 

         AppWidgetManager appWidgetManager = AppWidgetManager.getInstance(context);

            ComponentName thisAppWidget = new ComponentName(context.getPackageName(), MyWidgetProvider.class.getName());
            int[] appWidgetIds = appWidgetManager.getAppWidgetIds(thisAppWidget);
             appWidgetManager.notifyAppWidgetViewDataChanged(appWidgetIds,  R.id.listviewnew);
           Log.e("finally after a whole day", "working :");  

    

【讨论】:

此方法不稳定: 1. AppWidgetProvider接收广播大约需要4秒; 2. 有时,AppWidgetProvider 根本无法接收到广播。请使用***.com/a/7738687/903665中的方法 除此方案外,我在 onDataSetChanged 方法中重复了 onCreate 方法的功能,创建了另一个方法来加载数据并由两个方法共享。

以上是关于Android appwidget remoteviews没有更新的主要内容,如果未能解决你的问题,请参考以下文章

Android:具有自定义视图的 AppWidget 不起作用

Android桌面小部件AppWidget开发

将 AppWidgets 绑定到 AppWidgetHost - Android

在 appwidget 中调整自定义视图大小的问题,无法确定 android 上的实际大小 appwidget,尤其是在平板电脑上

onUpdate 未在小部件中调用,即使我在 onreceive 中看到 android.appwidget.action.APPWIDGET_UPDATE 意图

Android - AppWidgets、AlarmManager 和 AsyncTask