web-dev-qa-db-ja.com

アクティビティ/サービス/レシーバーからウィジェットをプログラムで更新する

可能ですが、メインアクティビティからウィジェットの更新をトリガーする方法がわかりません。放送できる一般的な意図はありませんか?

91
Nuvious

areを使用してAppWidgetProviderを使用する場合、次の方法で更新できます。

Intent intent = new Intent(this, MyAppWidgetProvider.class);
intent.setAction(AppWidgetManager.ACTION_APPWIDGET_UPDATE);
// Use an array and EXTRA_APPWIDGET_IDS instead of AppWidgetManager.EXTRA_APPWIDGET_ID,
// since it seems the onUpdate() is only fired on that:
 int[] ids = AppWidgetManager.getInstance(getApplication())
    .getAppWidgetI‌​ds(new ComponentName(getApplication(), MyAppWidgetProvider.class));
intent.putExtra(AppWidgetManager.EXTRA_APPWIDGET_IDS, ids);
sendBroadcast(intent);
170
phaethon

これは、私がサービス/アクションからウィジェットを更新する方法で検索したときに役立ちました(ただし、すべてのコンテキストから可能かもしれません):

Context context = this;
AppWidgetManager appWidgetManager = AppWidgetManager.getInstance(context);
RemoteViews remoteViews = new RemoteViews(context.getPackageName(), R.layout.widget_2x1);
ComponentName thisWidget = new ComponentName(context, MyWidget.class);
remoteViews.setTextViewText(R.id.my_text_view, "myText" + System.currentTimeMillis());
appWidgetManager.updateAppWidget(thisWidget, remoteViews);
69
Stuck

そのため、アクティビティからウィジェットを更新するには、次のようにします。

Intent intent = new Intent(this, DppWidget.class);
intent.setAction("Android.appwidget.action.APPWIDGET_UPDATE");
int ids[] = AppWidgetManager.getInstance(getApplication()).getAppWidgetIds(new ComponentName(getApplication(), DppWidget.class));
intent.putExtra(AppWidgetManager.EXTRA_APPWIDGET_IDS,ids);
sendBroadcast(intent);

私のために働く:)

28
Voidcode

これを試して:

int[] ids = AppWidgetManager.getInstance(getApplication()).getAppWidgetIds(new ComponentName(getApplication(), MyWidget.class));
        MyWidget myWidget = new MyWidget();
        myWidget.onUpdate(this, AppWidgetManager.getInstance(this),ids);
25

ListView、GridView、StackViewなどのコレクションを使用するウィジェットを使用してウィジェットのアイテムを更新する場合は、次のようにします。

Context context = getApplicationContext();
AppWidgetManager appWidgetManager = AppWidgetManager.getInstance(context);
ComponentName thisWidget = new ComponentName(context, StackWidgetProvider.class);
int[] appWidgetIds = appWidgetManager.getAppWidgetIds(thisWidget);
appWidgetManager.notifyAppWidgetViewDataChanged(appWidgetIds, R.id.stack_view);

このメソッドnotifyAppWidgetViewDataChanged()を使用すると、ウィジェットアイテムに新しいデータをリアルタイムで取得させることができます。

14
thanhtd
int widgetIDs[] = AppWidgetManager.getInstance(getApplication()).getAppWidgetIds(new ComponentName(getApplication(), WidgetProvider.class));

for (int id : widgetIDs)
    AppWidgetManager.getInstance(getApplication()).notifyAppWidgetViewDataChanged(id, R.id.widget_view);
}
11
Jakob Eriksson

AppWidgetManagerインスタンスを取得して、直接更新するだけです。または、IntentServiceを使用して更新を行う場合は、IntentServicestartService()を呼び出します。 AppWidgetProvideraアプリウィジェットを更新する方法ですが、唯一の方法ではありません。

5
CommonsWare

KotlinでのPhaethonの受け入れられたソリューション:

_    val intent = Intent(this, MyAppWidgetProvider::class.Java)
    intent.action = AppWidgetManager.ACTION_APPWIDGET_UPDATE
    val ids = AppWidgetManager.getInstance(application).getAppWidgetIds(ComponentName(getApplicationContext(),MyAppWidgetProvider::class.Java!!))
    intent.putExtra(AppWidgetManager.EXTRA_APPWIDGET_IDS, ids)
    sendBroadcast(intent)
_

MyAppWidgetProviderはAppWidgetProviderから派生します。
class MyAppWidgetProvider : AppWidgetProvider() {

0
Elletlar