3

以下は、AppWidgetProvider を拡張するウィジェットのコードです。ウィジェットはホーム画面に配置すると正しくレンダリングされますが、ビューは空です。ロギングを使用して、RemoteViewsService.RemoteViewsFactory の実装を返す RemoteViewsService (BudgetWidgetService) を拡張するために使用したクラスからメソッドが呼び出されていないことがわかりました。

BudgetWidgetService がインスタンス化または使用されない原因となる間違いはありますか?

作成した RemoteViews レイアウトに BudgetWidgetService がバインドされているかどうかを確認する方法すら見つかりません。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;
}
4

1 に答える 1

11

android.permission.BIND_REMOTEVIEWS私は同じ問題を抱えていて、AndroidManifest.xml で RemoteViewsService にアクセス許可を追加するのを忘れていたことを発見しました。

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

App Widgets guideの「コレクションを含むアプリ ウィジェットのマニフェスト」セクションで答えを見つけました。

于 2013-06-30T03:48:06.833 に答える