2012-07-29 11 views
7

Tworzę widget w Androidzie, który po kliknięciu generuje losową liczbę. Kiedy widget jest sam na ekranie głównym, działa idealnie, jednak po dodaniu wielu z nich zaczyna generować losowe liczby w tym samym czasie. Co się dzieje, gdy pojedynczy widget jest kliknięty, aktualizuje je wszystkie; co daje wiele losowych liczb. Chciałbym, aby każdy widget był odizolowany od innych; w zasadzie po kliknięciu widgetu aktualizuje się tylko i nie dotyczy innych. Myślę, że jest to możliwe do uzyskania, pobierając identyfikator bieżącego widgetu i aktualizując tylko ten, zgodnie z metodą aktualizacji aktualizującą wszystkie widżety; jak mam to zrobic?Aktualizuj tylko bieżący identyfikator widgetu Android w metodzie aktualizacji

Mój kod

@Override 
public void onUpdate(Context context, AppWidgetManager appWidgetManager, 
     int[] appWidgetIds) { 

    // Get all ids 
    ComponentName thisWidget = new ComponentName(context, 
      MyWidgetProvider.class); 
    int[] allWidgetIds = appWidgetManager.getAppWidgetIds(thisWidget); 
    for (int widgetId : allWidgetIds) { 
     // Create some random data 
     int number = (new Random().nextInt(100)); 

     RemoteViews remoteViews = new RemoteViews(context.getPackageName(), 
       R.layout.widget_layout); 
     Log.w("WidgetExample", String.valueOf(number)); 
     // Set the text 
     remoteViews.setTextViewText(R.id.update, String.valueOf(number)); 

     // Register an onClickListener 
     Intent intent = new Intent(context, MyWidgetProvider.class); 

     intent.setAction(AppWidgetManager.ACTION_APPWIDGET_UPDATE); 
     intent.putExtra(AppWidgetManager.EXTRA_APPWIDGET_IDS, appWidgetIds); 

     PendingIntent pendingIntent = PendingIntent.getBroadcast(context, 
       0, intent, PendingIntent.FLAG_UPDATE_CURRENT); 
     remoteViews.setOnClickPendingIntent(R.id.update, pendingIntent); 
     appWidgetManager.updateAppWidget(widgetId, remoteViews); 
    } 
} 

Podsumowanie:

Ten kod jest metoda aktualizacji i jest wywoływana po kliknięciu widget. Chcę, aby ta metoda aktualizowała tylko identyfikator widżetu, który go wywoływał, a nie aby ta metoda aktualizowała wszystkie identyfikatory widżetów na ekranie głównym.

Odpowiedz

9

miałem ten sam problem i znalazłem ten sposób rozwiązywać je:
1.To móc odróżnić wielu wystąpień tego samego AppWidgetProvider, podczas rejestracji zdarzenia „onclick” (intent) trzeba dodać dodatkowy wartość z ID widget (appWidgetId):

Intent clickIntent = new Intent(context, DigiStation.class); 
clickIntent.putExtra(AppWidgetManager.EXTRA_APPWIDGET_ID, appWidgetId); 
PendingIntent pendingIntent = PendingIntent.getBroadcast(context, appWidgetId, clickIntent, 0); 

2.Update tylko poglądy bieżącej instancji:

appWidgetManager.updateAppWidget(appWidgetId, views); 

3.Android ponownie wykorzystuje zamiary, więc podczas tworzenia intencji, upewnij się, wstawić unikalny identyfikator, albo taki sam zamiar stosować zanim zostanie uruchomiony dla wszystkich instancji:

PendingIntent pendingIntent = PendingIntent.getBroadcast(context, appWidgetId, clickIntent, 0); 

4.When obsługi zdarzenia click, uzyskać appWidgetId z „dodatków” ładowności zamiarem.
Można znaleźć więcej przydatnych informacji here.

+0

Dziękuję za to, rozwiązałem bardzo drażliwy błąd. Kluczową sprawą jest umieszczenie unikatowej zmiennej RequestCode w wywołaniu getBroadcast() lub getActivity() w celu uzyskania oczekującego zamiaru i uniknięcia ponownego użycia w sposób wyjaśniony. Używanie appWidgetId wydaje się dobrze dla mnie. –

+0

co oznacza ostatni parametr PendingIntent.getBroadcast()? Nie ma stałej FLAG o wartości 0. – cn123h

+0

OK, próbowałem różnych FLAG, żaden z nich nie działa. Jak wspomnieli Andrew i hasanghaforian, drugi parametr, requestCode musi być unikalny dla każdej instancji widgetu. – cn123h

Powiązane problemy