활동 / 서비스 / 수신자에서 프로그래밍 방식으로 위젯 업데이트


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합니까?
Kris B

38
@KrisB는 아래 답변에서 다음을 수행하여 배열을 가져옵니다. int ids [] = AppWidgetManager.getInstance (getApplication ()). getAppWidgetIds (new ComponentName (getApplication (), WidgetProvider.class));
MobileMon

11
당신은 상수를 사용할 수 있습니다, 필요가 하드 코딩 없습니다 :intent.setAction(AppWidgetManager.ACTION_APPWIDGET_UPDATE);
마틴 Briedis

3
widgetID에 R.xml.mywidget을 사용하기 위해 @gelupa 주석을 따르지 마십시오! 완전히 잘못되었으며 디버깅에 4 시간이 소요됩니다 !!! 사용 MobileMon 솔루션은 올바른은 widgetid를 얻을
Ilja S.에게

5
;`의 INT widgetIDs [] = AppWidgetManager.getInstance (활성) .getAppWidgetIds (새 ComponentName (활성 widget.class))에 대한 IDS
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 년

이것은 나에게도 효과적이었습니다. 나는 우리가 broadcast와 onReceive를해야한다고 생각했지만 내 요구 사항은 이것에 완벽하게 맞습니다
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 메서드를 호출하는 방법을 원합니다.
Amit Thaper 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 메소드를 호출의 의미를 알고 있지만, 어이없는, 마침내 : 작동
엔리케 드 수자

1
감사. 지금 테스트 중이며 피드백을 게시 할 예정입니다. 테스트 및 확인 작업. 다른 유형의 위젯이 있다면 동일하게 작동할까요? (일하기 위해 +1)
Si8

나는 항상 ids 0
omor

이것은 Android Oreo에서 작동하지 않습니다.
stuckedoverflow

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
분-API를 요구 레벨 : 11
사진 제공 : Anirudh Ramanathan

대박. 루프 할 필요도없고 notifyAppWidgetViewDataChanged()배열을 사용 하는 버전이 있습니다.
로렌스 Kesteloot

2

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


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.