2010-11-01 4 views
12

Mam widżet, jego konfigurację, więc po kliknięciu na niego otwiera niektóre ustawienia w działaniu.Aktualizacja widgetu Android z działania

views.setOnClickPendingIntent(R.id.btnActivate, pendingIntent); 

Spowoduje to skonfigurowanie niektórych ustawień aplikacji. Chcę, aby widżet zaktualizował swój widok, aby odzwierciedlał zmienione ustawienia po uruchomieniu Aktywności, które uruchamiam. Używanie interwału aktualizacji lub innego rodzaju pobierania nie jest odpowiednie.

Widziałem kilka miejsc tutaj oraz w android docs to kod używany:

appWidgetManager.updateAppWidget(mAppWidgetId, views); 

Ale ja nie wiem, jak uzyskać wartość mAppWidgetId. Próbowałem następujący przykład dla działalności konfiguracji widget tutaj http://developer.android.com/guide/topics/appwidgets/index.html, ale w poniższym kodzie

Intent intent = getIntent(); 
Bundle extras = intent.getExtras(); 
if (extras != null) { 
    mAppWidgetId = extras.getInt(
      AppWidgetManager.EXTRA_APPWIDGET_ID, 
      AppWidgetManager.INVALID_APPWIDGET_ID); 
} 

dodatki zawsze jest null, więc nigdy nie uzyskać AppWidgetID.

Ok, teraz tylko się włóczę. Jak myślisz, co mogę zrobić?

Odpowiedz

17

W końcu znalazłem odpowiedź, której szukałem, było w przeciążeniu funkcji updateAppWidget.

appWidgetManager.updateAppWidget(new ComponentName(this.getPackageName(), Widget.class.getName()), views); 

To pozwala mi uzyskać dostęp do widgetu bez konieczności znajomości appWidgetID. Mój ostatni kod w mojej działalności jest następnie:

 // Create an Intent to launch ExampleActivity 
    Intent intent = new Intent(this, Settings.class); 
    PendingIntent pendingIntent = PendingIntent.getActivity(this, 0, intent, 0); 

    views.setOnClickPendingIntent(R.id.btnActivate, pendingIntent); 

    AppWidgetManager appWidgetManager = AppWidgetManager.getInstance(this); 
    appWidgetManager.updateAppWidget(new ComponentName(this.getPackageName(), Widget.class.getName()), views); 
    finish(); 

muszę zrobić wszystko sam materiał instalacyjny musiałem zrobić w onUpdate metody widgetu, ale teraz za każdym razem kiedy zakończyć moją aktywność Widget są wyświetlane te poprawny stan.

+0

Dzięki za podzielenie się odpowiedzią !!! Gdzie musimy umieścić ten kod, wewnątrz ustawienia widgetu lub wewnątrz klasy widżetów ??? – BamsBamx

+0

Nieważne, wstawiłem to do metody updateWidget, zmieniłem niektóre "to" według "kontekstu" i usunąłem "AppWidgetManager appWidgetManager = AppWidgetManager.getInstance (this)" Teraz działa ... dzięki! – BamsBamx

+1

Jeśli masz wiele konfiguracji dla widgetów, możesz wypróbować appWidgetManager.getAppWidgetIds (komponent), a następnie iterować nad nimi. – rwilson04

13

Jest jeszcze jeden sposób, aby to zrobić - przekazać id widget w oczekiwaniu intencyjny, którego używasz, aby rozpocząć działalność:

Intent clickIntent=new Intent(context, MyConfigActivity.class); 
clickIntent.putExtra(AppWidgetManager.EXTRA_APPWIDGET_ID, widgetId); 
// you have the widgetId here, since it's your onUpdate 
PendingIntent pendingIntent=PendingIntent 
     .getActivity(context, 0, 
       clickIntent, 
       PendingIntent.FLAG_UPDATE_CURRENT); 
views.setOnClickPendingIntent(R.id.btnActivate, pendingIntent); 

Ponadto, aby uniknąć powielania kodu z onUpdate(), można transmisja zamiaru z powrotem do AppWidgetProvider:

Intent intent = new Intent(this,MyAppWidgetProvider.class); 
intent.setAction("android.appwidget.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 = {widgetId}; 
intent.putExtra(AppWidgetManager.EXTRA_APPWIDGET_IDS,ids); 
sendBroadcast(intent); 
+0

Dzięki za udostępnienie kodu. Teraz mogę aktualizować widget z działania –

8

Wiem, że odpowiedź została przyjęta i przyjęta. Jednak gdy szukałem tego samego, natknąłem się na niesamowicie prosty sposób aktualizacji widgetu.

Dla przyszłych czytelników:

najlepsza część, to działa na wszystkich wystąpień widget iz każdym kontekście (aktywność, usługowych itp)

Herezje Kodeksu

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

Courtesy - Stuck :)

+1

This !! Walczę od wieków próbując zaktualizować widok TextView na widżecie, co rozwiązało problem. Dziękuję Ci!! :) – wislon

+0

Twoje najmilej. Cała przyjemność po mojej stronie. Happy Coding. :) –

+0

To zadziałało dla mnie ... Dziękuję kumplu :) – user1090751

1

Zamiast wykonywać połączenie z Twojej aktywności, wolę wysłać żądanie przesyłania szerokopasmowego do widgetu w celu aktualizacji. Metoda onUpdate zostanie uruchomiona i wszystkie układy widgetów zostaną przekazane.

Oto mój kod poniżej:

1- wysyłania szeroki obsady z działalności:

Intent intent = new Intent(ctxt, MyAppWidgetProvider.class); 
intent.setAction(AppWidgetManager.ACTION_APPWIDGET_UPDATE); 

int[] ids = {R.layout.appwidget}; 
intent.putExtra(AppWidgetManager.EXTRA_APPWIDGET_IDS,ids); 
ctxt.sendBroadcast(intent); 

i teraz, 2- wdrożyć onUpdate metody:

Intent i = new Intent(ctxt, Settings.class); 
PendingIntent pi = PendingIntent.getActivity(ctxt, 0, i, 0); 

for (int widgetId : allWidgetIds) { 
    RemoteViews remoteViews = new RemoteViews(ctxt.getPackageName(), widgetId); 
    remoteViews.setTextViewText(R.id.statusMsg, msg); 
    remoteViews.setOnClickPendingIntent(R.id.rootView, pi); 
    AppWidgetManager mngr = AppWidgetManager.getInstance(ctxt); 
    ComponentName wdgt = new ComponentName(ctxt, MyAppWidgetProvider.class); 
    mngr.updateAppWidget(wdgt, remoteViews); 
} 

że jest ! Szkoda, że ​​ci to nie pomaga :)