2010-11-19 16 views
5

Ich schreibe ein Android-Soundboard, mit dem der Benutzer mehrere Desktop-Widgets erstellen kann, eines für jeden Ton. Ich verwende eine Aktivität für den Benutzer, um auszuwählen, für welchen Sound er das Widget erstellen möchte. Für jedes erstellte Widget speichere ich eine gemeinsame Einstellung in Form von
key => "WIDGET_FILENAME_"+widgetId, value=> fileName
Um die Sounds zu spielen, habe ich die onRecieve-Methode für die widgetProvider-Klasse überschrieben. Wenn der Desktop-Widget angeklickt wird, löst es sich um eine Sendung zu dieser Methode, wich das Widget-ID aus der Absicht bekommt und lädt dann die gemeinsame Vorliebe mit dem Widget zugeordnet:
Android - Mehrere appWidgets spielen verschiedene Sounds

 

int appWidgetId = intent.getIntExtra(AppWidgetManager.EXTRA_APPWIDGET_ID, 
            AppWidgetManager.INVALID_APPWIDGET_ID); 

 

Das Problem ist: Die widgetId ist immer dasselbe, kein Mather, welches Widget angeklickt wird, wodurch der gleiche Sound wiedergegeben wird.
Irgendeine Idee oder Anleitung zu diesem Thema?

Antwort

7

hatte ich das gleiche Problem und löste es dies wie:

  1. In Ihrem AppWidgetProviderClass erklären Ihre Absicht wie folgt:

    Intent intent = new Intent(context, YourActivity.class) 
         .addFlags(Intent.FLAG_ACTIVITY_NEW_TASK) 
         .putExtra(AppWidgetManager.EXTRA_APPWIDGET_ID, appWidgetId); 
    
  2. ... und PendingIntent

    PendingIntent pi = PendingIntent.getActivity(context, appWidgetId, intent, 
                  PendingIntent.FLAG_UPDATE_CURRENT); 
    
  3. In der Aktivitätsklasse, nachdem Sie die gewünschte appWidgetId erhalten haben Datum:

    int currentWidgetId = this.getIntent().getIntExtra(
         AppWidgetManager.EXTRA_APPWIDGET_ID, AppWidgetManager.INVALID_APPWIDGET_ID); 
    
  4. ... Sie eine Funktion ähnlich wie diese verwenden:

    private void updateWidgetView() { 
        views = new RemoteViews(YourWidget.class.getPackage().getName(), 
              R.layout.main_widget); 
        mgr = AppWidgetManager.getInstance(this); 
        views.setTextViewText(R.id.some_text_view, someText); 
        // Tell the AppWidgetManager to perform an update on the current App Widget 
        mgr.updateAppWidget(currentWidgetId, views); 
    } 
    
+1

Großartig! hat mir wirklich geholfen, das gleiche Problem zu lösen, das ich hatte. Der interessante Teil ist, dass der Unterschied darin lag, die appWidgetId als requestCode zu verwenden, während in der Dokumentation steht, dass dies nie verwendet wird ... – Muzikant

+0

@Rabi, haben Sie einen vollständigeren Code, den Sie teilen könnten? Ich habe versucht, dies in meinen Code zu implementieren und es funktioniert einfach nicht. http://stackoverflow.com/questions/10607518/android-appwidget-multiple-instances – MrGibbage

0

Ich hatte dieses Problem schon jetzt und mit diesem Code das Problem weg ist, denken, dass Die WidgetAppId im Intent und das Flag Create new machen diesen Intent immer eindeutig.