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


97

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

回答:


191

あなたがいる場合している使用して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);

30
どこに設定しwidgetIdますか?
クリスB

38
@KrisB以下の答えから、これを実行して配列を取得します。int ids [] = AppWidgetManager.getInstance(getApplication())。getAppWidgetIds(new ComponentName(getApplication()、WidgetProvider.class));
MobileMon

11
定数を使用できます。ハードコードする必要はありません。intent.setAction(AppWidgetManager.ACTION_APPWIDGET_UPDATE);
MārtiņšBriedis 2013

3
widgetIDにR.xml.mywidgetを使用するために@gelupaコメントをフォローしないでください!それは完全に間違っており、私に4時間のデバッグ費用がかかります!!! MobileMonソリューションを使用して正しいウィジェットIDを取得
Ilja S.

5
idの場合: `int widgetIDs [] = AppWidgetManager.getInstance(activity).getAppWidgetIds(new ComponentName(activity、widget.class));`
abbasalim

75

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

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);

私はここに6か月遅れで飛び込んでいることを知っています。しかし、私はアンドリューに同意します。このスレッドで独自の方法を試しました。そして、IDがどのように取得されるかについて、それが失敗し始めました。この方法(フィールドを手動で直接更新する方法)の方が効果的です。私の目的では、少なくとも。
durbnpoisn 2014

すごいもの。あなたがこれでどのように終わったかはわかりませんが、私のウィジェットのすべてのインスタンスでうまくスムーズに機能します。:)
Atul O Holic 2014年

これも私にとってはうまくいきました。ブロードキャストと受信を行う必要があると思いましたが、私の要件はこれに完全に適合しています
stingray_

30

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

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);

私のために働く:)


onRecieveオーバーライドメソッドを呼び出します。しかし、私はonUpdateメソッドを呼び出す方法を求めています。
アミットターパー2013

25

これを試して:

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

2
驚くべきことに、この小さな答えだけがそれを解決しました。Widgetクラスをインスタンス化してonUpdateメソッドを直接呼び出すことの影響はまだわかりませんが、やっと動作します:)
Henrique de Sousa

1
ありがとう。私は今それをテストしており、フィードバックを投稿します。動作確認済み。ウィジェットの種類が異なる場合、同じように機能しますか?(+1作業用)
Si8

私は常にID 0を取得します

これはAndroid Oreoでは機能しません。
スタックオーバーフロー

15

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()を使用すると、ウィジェット項目に新しいデータをリアルタイムでフェッチさせることができます。


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

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

1
min-apiレベルが必要です:11
2013

驚くばかり。ループする必要さえありませんnotifyAppWidgetViewDataChanged()。配列を取るバージョンがあります。
Lawrence Kesteloot 2016年

2

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

    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() {


2

YourWidgetProvider.classに明示的にアクセスできない(たとえば、別のモジュールまたはライブラリから)ウィジェットをプログラムで更新しようとしている場合は、YourWidgetProvider.class.getName()が出力するものをキャプチャして定数を作成できます。

val WIDGET_CLASS_NAME = "com.example.yourapplication.YourWidgetProvider"

その後、これを暗黙的に使用できます。

val intent = Intent(AppWidgetManager.ACTION_APPWIDGET_UPDATE)
val widgetManager = AppWidgetManager.getInstance(context)
val ids = widgetManager.getAppWidgetIds(ComponentName(context, WIDGET_CLASS_NAME))
AppWidgetManager.getInstance(context).notifyAppWidgetViewDataChanged(ids, android.R.id.list)
intent.putExtra(AppWidgetManager.EXTRA_APPWIDGET_IDS, ids)
context.sendBroadcast(intent)
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.