2012-05-14 10 views
10

Pracowałem nad widgetem i poczyniłem pewne postępy (mam nadzieję), ale nadal nie mogę zrobić tego, co chcę.Widżet Androida nie aktualizuje się - ma niepoprawny identyfikator widżetu

Mam działanie konfiguratora, który działa poprawnie. Po zakończeniu wywołuję metodę updateAppWidget w klasie WordWidget, a widget aktualizuje losową liczbę.

To, czego nie mogę zrobić, powoduje zmianę liczby losowej ze względu na onClick. Zgodnie z logiem wprowadzam metodę onReceive(), ale to dotyczy.

W logu drukuję identyfikator widżetu. Zauważyłem, że po uruchomieniu z działania konfiguratora jest drukowanie appWidgetId = 33, ale po naciśnięciu widgetu drukuje appWidgetId = 24.

Jest to kod:

public class WordWidget extends AppWidgetProvider 
{ 

    @Override 
    public void onUpdate(Context context, AppWidgetManager appWidgetManager, int[] appWidgetIds) 
    { 
     //This is run when a new widget is added or when the update period expires. 
     Log.v("wotd", "In onUpdate(), updating " + appWidgetIds.length + " widgets"); 
     Log.v("wotd", " the array is " + appWidgetIds.toString()); 

     for(int x = 0; x < appWidgetIds.length; x++) 
     { 
      Integer appWidgetId = appWidgetIds[x]; 


      //Method that updates the random value 
      updateAppWidget(context, appWidgetManager, appWidgetId); 
     } 
    } 

    @Override 
    public void onReceive(Context context, Intent intent) 
    { 
     super.onReceive(context, intent); 
     Log.v("wotd", "In onReceive() with intent=" + intent.toString()); 
     if (intent.getAction().equals("android.appwidget.action.APPWIDGET_UPDATE")) 
     { 
      Integer mAppWidgetId; 
      AppWidgetManager appWidgetManager = AppWidgetManager.getInstance(context); 

      Bundle extras = intent.getExtras(); 
      if(extras != null) 
      { 
       Log.v("wotd", "In onReceive(), extras is valid"); 
       mAppWidgetId = extras.getInt(AppWidgetManager.EXTRA_APPWIDGET_ID, AppWidgetManager.INVALID_APPWIDGET_ID); 

       //If they gave us an intent without a valid widget Id, just bail. 
       if (mAppWidgetId != AppWidgetManager.INVALID_APPWIDGET_ID) 
       { 
        Log.v("wotd", "In onReceive(), mAppWidgetId is ok"); 
        updateAppWidget(context, appWidgetManager, mAppWidgetId); 
       } 
      } else 
      { 
       Log.v("wotd", "In onReceive(), extras is INVALID"); 
       mAppWidgetId = AppWidgetManager.INVALID_APPWIDGET_ID; 
      } 
     } 


    } 


    static void updateAppWidget(Context context, AppWidgetManager appWidgetManager, Integer appWidgetId) 
    { 
     Log.v("wotd", "In updateAppWidget() with appWidgetId=" + appWidgetId); 

     //Setup onClick 
     Intent widgetIntent = new Intent(context, WordWidget.class); 
     widgetIntent.setAction("android.appwidget.action.APPWIDGET_UPDATE"); 
     widgetIntent.putExtra(AppWidgetManager.EXTRA_APPWIDGET_ID, appWidgetId); 
     PendingIntent widgetPendingIntent = PendingIntent.getBroadcast(context, 0, widgetIntent, 0); 

     Integer nextNumb = new Random().nextInt(100); 
     Log.v("wotd", "In updateAppWidget(), nextNumb = " + nextNumb.toString()); 

     RemoteViews remoteView = new RemoteViews(context.getPackageName(), R.layout.widgetlayout); 
     remoteView.setTextViewText(R.id.mainText, String.valueOf(nextNumb)); 
     remoteView.setOnClickPendingIntent(R.id.mainText, widgetPendingIntent); 

     // Tell the widget manager 
     appWidgetManager.updateAppWidget(appWidgetId, remoteView); 
    } 
} 

Jest to plik dziennika, od kiedy dotykam widżet (zauważ, że aktywność prefs posiada również wydruk dziennika i wskazuje identyfikator widget jako inny numer, który to):

05-14 17:15:47.453: V/wotd(1585): In onReceive() with intent=Intent { act=android.appwidget.action.APPWIDGET_UPDATE flg=0x10000000 cmp=com.rfxlabs.wordofthedaywidget/.WordWidget bnds=[202,177][222,201] (has extras) } 
05-14 17:15:47.453: V/wotd(1585): In onReceive(), extras is valid 
05-14 17:15:47.463: V/wotd(1585): In onReceive(), mAppWidgetId is ok 
05-14 17:15:47.463: V/wotd(1585): In updateAppWidget() with appWidgetId=24 

05-14 17: 15: 47,463: V/wotd (1585): W updateAppWidget(), nextNumb = 42

Więc jak widać, jestem rzeczywiście wejściu do mojego updateAppWidget metoda, ale z jakiegoś powodu appWidgetId jest niepoprawny.

Jakieś pomysły, dlaczego tak się dzieje? Wielkie dzięki!

+0

co jest problemem, który chcesz zaktualizować ty widget na cick widget czy coś innego? –

+0

Tak, chcę, aby losowa liczba zmieniała się za każdym razem, gdy dotknę widgetu. – Sandy

+0

Czy na pewno nie masz dwóch kopii tego samego kodu z niewielką różnicą .. – Ronnie

Odpowiedz

20

W funkcji updateAppWidget iść do tej linii:

PendingIntent widgetPendingIntent = PendingIntent.getBroadcast(context, 0, widgetIntent, 0); 

... i zmień ją na:

PendingIntent widgetPendingIntent = PendingIntent.getBroadcast(context, appWidgetId, widgetIntent, 0); 
+0

javadocs jawnie stwierdza, że ​​drugi parametr (kod żądania) nie jest używany. –

+0

To działa! Nie wiem dlaczego. Ktoś może wyjaśnić, co dzieje się w tej linii z magią? – deviant

+3

Nie ma magii, tylko PendingIntents muszą być unikatowe według projektu. Identyfikatory widżetów używane jako kody żądań pomagają odróżnić jedną instancję od innej –

0

aktualizowania widżet ekranu głównego w dotyku musisz zarejestrować niestandardową transmisję Odbiorca w Manifest i dodaj go jako akcję z widżetem jako:

Krok 1: Zarejestruj odbiornik niestandardowy jako:

<intent-filter> 
<action android:name="com.imrankhanandroid.HomeWidgetRandomNum.ACTION_WIDGET_RANDOM"/> 
</intent-filter> 

Krok 2: W widżet klasy Addaction do układu jako:

public void onReceive(Context paramContext, Intent paramIntent) 
    { 
     //Intent 
     String str = paramIntent.getAction(); 
     if (paramIntent.getAction().equals(ACTION_WIDGET_RANDOM)) { 
      updateWidgetState(paramContext, str); 
     } 
     else 
      { 
       super.onReceive(paramContext, paramIntent); 
      } 
    } 

Krok 3: In Your updateWidgetState dodać nową akcję do intencyjny jak:

rview = new RemoteViews(paramContext.getPackageName(), R.layout.widget_layoutmain); 
Intent active = new Intent(paramContext, Randomnuberwidget.class); 
active.setAction(ACTION_WIDGET_RANDOM); 
PendingIntent actionPendingIntent = PendingIntent.getBroadcast(paramContext, 0, active, 0); 
rview.setOnClickPendingIntent(R.id.ImageView_gps, actionPendingIntent); 

Wreszcie można pobrać przykład Working HomeWidget z TUTAJ HomeWidgetRendomNumber Którego erating Random Number On Every Click.

0

Musisz ustawić ostatnią flagę w getBroadcast: PendingIntent.FLAG_UPDATE_CURRENT

Powiązane problemy