2013-05-20 33 views
2

下面是我的小部件扩展AppWidgetProvider的一些代码。小部件呈现在主屏幕上时正确呈现,但视图为空。使用日志记录,我发现没有方法从我用来扩展RemoteViewsService(BudgetWidgetService)的类中调用,它返回RemoteViewsService.RemoteViewsFactory的实现。RemoteViewsService中没有方法触发 - Android

是否有错误导致BudgetWidgetService永远不会被实例化或使用?

我什至不能找到一种方法来检查BudgetWidgetService是否绑定到我创建的RemoteViews布局。如果你能想到的任何我可以进一步诊断这个问题,不是记录在我的AppWidgetProvider和RemoteViewsService的扩展方法调用等,我会理解为好,

@Override 
public void onUpdate(Context context, AppWidgetManager appWidgetManager, int[] appWidgetIds) { 
    Log.i("Budget Widget", "Provider onUpdate called"); 
    // Update each of the widgets with the remote adapter 
    for (int i = 0; i < appWidgetIds.length; ++i) { 
     RemoteViews layout = buildLayout(context, appWidgetIds[i]); 
     appWidgetManager.updateAppWidget(appWidgetIds[i], null); 
     appWidgetManager.updateAppWidget(appWidgetIds[i], layout); 
    } 
    super.onUpdate(context, appWidgetManager, appWidgetIds); 
} 

private RemoteViews buildLayout(Context context, int appWidgetId) { 
    Log.i("Budget Widget", "Provider buildLayout called"); 
    RemoteViews rv = new RemoteViews(context.getPackageName(), R.layout.widget_budget); 

    RemoteViews list_item = new RemoteViews(context.getPackageName(), R.layout.widget_budget_item); 
    list_item.setTextViewText(R.id.widget_budget_item_text, "Test #1"); 

    final Intent intent = new Intent(context, BudgetWidgetService.class); 
    intent.putExtra(AppWidgetManager.EXTRA_APPWIDGET_ID, appWidgetId); 
    intent.setData(Uri.parse(intent.toUri(Intent.URI_INTENT_SCHEME))); 
    rv.setRemoteAdapter(R.id.widget_budget_list, intent); 

    rv.setEmptyView(R.id.widget_budget_list, R.id.empty_view); 

    final Intent refreshIntent = new Intent(context, BudgetWidgetProvider.class); 
    refreshIntent.setAction(BudgetWidgetProvider.REFRESH_ACTION); 
    final PendingIntent refreshPendingIntent = PendingIntent.getBroadcast(context, 0, 
      refreshIntent, PendingIntent.FLAG_UPDATE_CURRENT); 
    rv.setOnClickPendingIntent(R.id.refresh_button, refreshPendingIntent); 

    return rv; 
} 

回答

10

我有同样的问题,并发现我已经忘了给android.permission.BIND_REMOTEVIEWS权限添加到我的RemoteViewsService在我的AndroidManifest.xml:

<service android:name="MyWidgetService" 
... 
android:permission="android.permission.BIND_REMOTEVIEWS" /> 

我发现部分下的“清单与收藏的应用小部件”上App Widgets guide我的答案。