활동 / 서비스 / 수신자에서 프로그래밍 방식으로 위젯 업데이트 있지만 기본 활동에서 위젯 업데이트를 트리거하는

가능하다는 것을 알고 있지만 기본 활동에서 위젯 업데이트를 트리거하는 방법을 찾을 수 없습니다. 방송 할 수있는 일반적인 의도가 없나요?



답변

를 사용하는 경우 다음 과 같이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);


답변

서비스 / 또는 작업에서 위젯을 업데이트하는 방법을 검색 할 때 도움이되었습니다 (그러나 모든 컨텍스트에서 가능할 수 있음).

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


답변

따라서 활동에서 위젯을 업데이트하려면 다음과 같이 할 수 있습니다.

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

나를 위해 작동합니다 🙂


답변

이 시도:

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


답변

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 ()를 사용하면 위젯 항목이 새 데이터를 실시간으로 가져 오도록 강제 할 수 있습니다.


답변

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

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


답변

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