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.
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. –
co oznacza ostatni parametr PendingIntent.getBroadcast()? Nie ma stałej FLAG o wartości 0. – cn123h
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