2013-11-28 22 views
5

Ho una appwidget che sto cercando di aggiornare da un'attività.AppWidgetManager.getAppWidgetIdI in attività restituisce una lista vuota

Per fare ciò, ho bisogno dell'ID appwidget.

Ho usato AppWidgetManager.getAppWidgetIds ma restituisce sempre una lista vuota.

Ho anche utilizzato AppWidgetManager.getInstalledProviders per verificare che il mio ComponentName sia corretto, ma ottengo comunque una lista vuota.

Ho visto tutte le altre domande a riguardo, ma non sono riuscito a trovare qualcosa che funzionasse per me.

C'è un altro modo per risolvere questo? o un altro modo per aggiornare il widget?

Il mio codice:

ComponentName name = new ComponentName(packageName, boardcastReceiverClass); 
AppWidgetManager appWidgetManager = AppWidgetManager.getInstance(this); 
int[] ids = appWidgetManager.getAppWidgetIds(name); 
if (ids != null && ids.length > 0) { 
    getApplicationContext().sendBroadcast(getUpdateIntent(ids[0])); 
} 

Grazie.

UPDATE: Devo dire che il mio AppWidgetProvider è in un progetto di libreria. Secondo il ComponentName che ottengo con getInstalledProviders, ho usato il nome del pacchetto della mia app e il nome della classe con il nome del pacchetto della libreria.

+0

Condividi il tuo codice in cui si pensa l'errore è ... –

+0

getAppWidgetIds() restituirà elenco vuoto se l'utente non ha attivato/installato il widget sulla schermata Home. .. –

+0

@GopalRao si, lo so. L'ho provato quando il widget era sulla schermata principale. – Ran

risposta

12

Puoi accedere al tuo widget di senza sapere id

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

Questa consentono di accedere il widget senza dover conoscere il 'appWidgetID' . Poi in attività:

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(); 
+0

Anche questa sembra la risposta alla mia domanda, ma ho difficoltà ad identificare i parametri. I parametri menzionati [appWidgetManager.updateAppWidget (new ComponentName (this.getPackageName(), Widget.class.getName()), views);], Innanzitutto, la classe widget è il provider di widget? la configurazione del widget? O un servizio dal widget? E in secondo luogo, le viste, non sto passando in nessun oggetto vista, a che cosa si riferisce il punto di vista? Quale sarebbe un esempio di vista all'interno di una classe di servizio? Grazie in anticipo per il vostro aiuto! – Silmarilos

+0

Scratch the views question, ho capito che significa remoteViews. – Silmarilos

0

Per ottenere il widget di ID applicazione .. utilizzare questo codice sotto

metodo

OnReceive() utilizzare questo codice sotto

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

in onUpdate() si ottiene l'elenco di ID già come parametro!

Se si desidera aggiornare da uso Attività Questo

Intent intent = new Intent(this, [activityname].class); 
    intent.setAction("android.appwidget.action.APPWIDGET_UPDATE"); 
    int ids[] = AppWidgetManager.getInstance(getApplication()).getAppWidgetIds(new ComponentName(getApplication(), [activityname].class)); 
    intent.putExtra(AppWidgetManager.EXTRA_APPWIDGET_IDS,ids); 
    sendBroadcast(intent); 
+0

Sto cercando di aggiornare il widget da un'attività, non dal ricevitore, quindi non ho 'onReceieve'. – Ran

1

Sto lavorando a qualcosa di simile ed ecco il modo più semplice per farlo funzionare.

Nella classe di servizio mettere questo dove si vuole per innescare un aggiornamento del widget di:

Intent brIntent = new Intent(AppWidgetManager.ACTION_APPWIDGET_UPDATE); 
sendBroadcast(brIntent); 

In questo modo l'OnReceive (contesto contesto, l'intenzione Intent) metodo nella classe AppWidgetProvider di essere chiamato. Quindi onRecieve può chiamare il codice per aggiornare il widget. Per un campione, ecco cosa ho usato. Sto semplicemente aggiornando il testo del widget:

 //Sample output text 
    String text = "My cat's name is wiggles."; 
    //get an AppWidgetManager 
    AppWidgetManager appWidgetManager = AppWidgetManager.getInstance(context); 
    //getComponentName 
    ComponentName thisWidget = new ComponentName(context, MyWidgetProvider.class); 
    //get the IDs for all the instances of this widget 
    int[] allWidgetIds = appWidgetManager.getAppWidgetIds(thisWidget); 
    //update all of the widgets 
    for (int widgetId : allWidgetIds) { 
     //get any views in this instance of the widget 
     RemoteViews remoteViews = new RemoteViews(context.getPackageName(), R.layout.widget_layout); 
     // Set the text 
     remoteViews.setTextViewText(R.id.widgetField, text); 
     //update the widget with any change we just made 
     appWidgetManager.updateAppWidget(widgetId, remoteViews); 
    } 
Problemi correlati