Autore Topic: Button che aggiorna widget  (Letto 1618 volte)

Offline mimmog

  • Utente senior
  • ****
  • Post: 731
  • Respect: +11
    • MisterX_Dev
    • Mostra profilo
  • Dispositivo Android:
    Galaxy Note e Galaxy Nexus
  • Play Store ID:
    MisterX_Dev
  • Sistema operativo:
    Windows 7
Button che aggiorna widget
« il: 18 Aprile 2011, 14:30:58 CEST »
0
Probabilmente ora mi sputerete in un occhio perchè stò per fare una domanda per molti banale però è la prima volta che uso i widget quindi devo prendere ancora la mano.

Ho fatto un programmino di prova con un layout costiuito da un button ed una textview, l'obiettivo è quello che cliccando il button si deve aggiornare la textview del widget con un numero random. Il problema è che clicco clicco ma stò numero non si aggiorna! Vi posto il codice :

Codice (Java): [Seleziona]
public class Widget extends AppWidgetProvider {
        private RemoteViews rview;
        private Random r;
        private int numero = 0;
       
        @Override
        public void onUpdate(Context context, AppWidgetManager appWidgetManager,int[] appWidgetIds) {
                r = new Random();
                numero = Math.abs(r.nextInt()%100);
                for (int i=0; i<appWidgetIds.length; i++) {
                        int id =  appWidgetIds[i];
                        Intent intent = new Intent(appWidgetManager.ACTION_APPWIDGET_UPDATE);
                        PendingIntent pendingIntent = PendingIntent.getActivity(context, 0, intent, 0);
                        rview = new RemoteViews(context.getPackageName(), R.layout.main);
                        rview.setOnClickPendingIntent(R.id.button1, pendingIntent);
                        rview.setTextViewText(R.id.textView1, Integer.toString(numero));
                        appWidgetManager.updateAppWidget(id, rview);
                 }
        }
}

mentre il widget nel Manifest l'ho dichiarato così :
Codice (Java): [Seleziona]
<receiver android:name="Widget">
        <intent-filter>
          <action android:name="android.appwidget.action.APPWIDGET_UPDATE" />
        </intent-filter>
        <meta-data android:name="android.appwidget.provider" android:resource="@xml/test_provider_info" />
</receiver>

Cosa non va ? :( Grazie!

Offline MarcoDuff

  • Moderatore globale
  • Utente storico
  • *****
  • Post: 1073
  • Respect: +202
    • Google+
    • marcoduff
    • Mostra profilo
    • MarcoDuff's Blog
  • Dispositivo Android:
    Samsung Galaxy Nexus
  • Play Store ID:
    MarcoDuff
  • Sistema operativo:
    Windows 7
Re:Button che aggiorna widget
« Risposta #1 il: 18 Aprile 2011, 16:34:20 CEST »
0
Se devi richiamare un receiver devi usare PendingIntent.getBroadcast e non PendingIntent.getActivity.

Offline mimmog

  • Utente senior
  • ****
  • Post: 731
  • Respect: +11
    • MisterX_Dev
    • Mostra profilo
  • Dispositivo Android:
    Galaxy Note e Galaxy Nexus
  • Play Store ID:
    MisterX_Dev
  • Sistema operativo:
    Windows 7
Re:Button che aggiorna widget
« Risposta #2 il: 18 Aprile 2011, 20:04:19 CEST »
0
Se devi richiamare un receiver devi usare PendingIntent.getBroadcast e non PendingIntent.getActivity.

Ciao Marco e grazie per la risposta, purtroppo ci ho provato ma non sortisce risultati premo stò cavolo di button ed il numero resta identico :( eppure il codice è questo che ho postato! notate qualche errore ?  ???

PS: Ho cambiato la riga "Intent intent = new Intent(appWidgetManager.ACTION_APPWIDGET_UPDATE);" con "Intent intent = new Intent(Intent.ACTION_VIEW,uri);" ed il PendingIntent l'ho riportato a getActivity ovviamente, ed il browser parte quando premo il button, quindi è proprio un problema del broadcast...

Offline MarcoDuff

  • Moderatore globale
  • Utente storico
  • *****
  • Post: 1073
  • Respect: +202
    • Google+
    • marcoduff
    • Mostra profilo
    • MarcoDuff's Blog
  • Dispositivo Android:
    Samsung Galaxy Nexus
  • Play Store ID:
    MarcoDuff
  • Sistema operativo:
    Windows 7
Re:Button che aggiorna widget
« Risposta #3 il: 18 Aprile 2011, 20:33:45 CEST »
0
Aspetta... sto notando solo adesso l'azione che tenti di mandare: ACTION_APPWIDGET_UPDATE.
Quella è una azione di sistema che non dovresti inviare tu (o se proprio lo devi fare devi anche includere gli extras: EXTRA_APPWIDGET_IDS)

Io ti consiglio di non usare una azione di sistema ma di crearti una tua azione e di inviare quella al receiver (ovviamente facendo l'overloading del metodo onReceive!).

Offline mimmog

  • Utente senior
  • ****
  • Post: 731
  • Respect: +11
    • MisterX_Dev
    • Mostra profilo
  • Dispositivo Android:
    Galaxy Note e Galaxy Nexus
  • Play Store ID:
    MisterX_Dev
  • Sistema operativo:
    Windows 7
Re:Button che aggiorna widget
« Risposta #4 il: 18 Aprile 2011, 20:59:09 CEST »
0
ok, come mi hai suggerito l'ho sostiuito con questo codice :
Codice (Java): [Seleziona]
public class Widget extends AppWidgetProvider {
        private static final String ACTION_ADD_NUMBER = "it.android.mio.widjetmio.ACTION_ADD_NUMBER";
        private RemoteViews rview;
        private Random r;
        private int numero = 0;
       
        @Override
        public void onUpdate(Context context, AppWidgetManager appWidgetManager,int[] appWidgetIds) {
                r = new Random();
                numero = Math.abs(r.nextInt()%100);
                for (int i=0; i<appWidgetIds.length; i++) {
                        int id =  appWidgetIds[i];
                        Intent intent = new Intent(ACTION_ADD_NUMBER);
                        PendingIntent pendingIntent = PendingIntent.getBroadcast(context, 0, intent, 0);
                        rview = new RemoteViews(context.getPackageName(), R.layout.main);
                        rview.setOnClickPendingIntent(R.id.button1, pendingIntent);
                        rview.setTextViewText(R.id.textView1, Integer.toString(numero));
                        appWidgetManager.updateAppWidget(id, rview);
                 }
        }
}

ed il manifest è diventato ;
Codice (Java): [Seleziona]
<receiver android:name="Widget">
                        <intent-filter>
                                <action android:name="it.android.mio.widjetmio.ACTION_ADD_NUMBER" />
                        </intent-filter>
                        <meta-data android:name="android.appwidget.provider" android:resource="@xml/test_provider_info" />
                </receiver>

però non ho capito che intendi per overloading dell'onReceive, dovrei fare l'override intendi del metodo onReceive del AppWidgetProvider ? se si, che ci devomettere nel metodo ? perchè così ora non mi visualizza nemmeno più il widget nell'elenco dei widget...

Offline MarcoDuff

  • Moderatore globale
  • Utente storico
  • *****
  • Post: 1073
  • Respect: +202
    • Google+
    • marcoduff
    • Mostra profilo
    • MarcoDuff's Blog
  • Dispositivo Android:
    Samsung Galaxy Nexus
  • Play Store ID:
    MarcoDuff
  • Sistema operativo:
    Windows 7
Re:Button che aggiorna widget
« Risposta #5 il: 18 Aprile 2011, 21:06:28 CEST »
0
Si scusami, l'override!

Tecnicamente devi fare questo: se l'azione è una tua azione la gestisci altrimenti richiami il super del metodo:
Codice (Java): [Seleziona]
@Override
public void onReceive(Context context, Intent intent)  {
    if (intent.getAction().equals(ACTION_ADD_NUMBER ))  {
        // Gestione tua azione
    } else super.onReceive(context, intent);
}

Ed in ogni caso nel manifest devi lasciare la riga
Codice (XML): [Seleziona]
<action android:name="android.appwidget.action.APPWIDGET_UPDATE" />altrimenti non ti funziona il widget!
« Ultima modifica: 18 Aprile 2011, 21:08:20 CEST da MarcoDuff »

Offline mimmog

  • Utente senior
  • ****
  • Post: 731
  • Respect: +11
    • MisterX_Dev
    • Mostra profilo
  • Dispositivo Android:
    Galaxy Note e Galaxy Nexus
  • Play Store ID:
    MisterX_Dev
  • Sistema operativo:
    Windows 7
Re:Button che aggiorna widget
« Risposta #6 il: 18 Aprile 2011, 21:12:35 CEST »
0
Ok rimettendo <action android:name="android.appwidget.action.APPWIDGET_UPDATE" /> mi è ricomaparlo nell'elenco però quello che non capisco è cosa devo mettere nell'override del onReceive per la mia azione ACTION_ADD_NUMBER io alla fine voglio solo che mi richiami il metodo onUpdate e questo dovrebbe avvenire in automatico se non erro per ogni invocazione del onReceive o sbaglio ?

Offline MarcoDuff

  • Moderatore globale
  • Utente storico
  • *****
  • Post: 1073
  • Respect: +202
    • Google+
    • marcoduff
    • Mostra profilo
    • MarcoDuff's Blog
  • Dispositivo Android:
    Samsung Galaxy Nexus
  • Play Store ID:
    MarcoDuff
  • Sistema operativo:
    Windows 7
Re:Button che aggiorna widget
« Risposta #7 il: 18 Aprile 2011, 21:30:58 CEST »
0
io alla fine voglio solo che mi richiami il metodo onUpdate e questo dovrebbe avvenire in automatico se non erro per ogni invocazione del onReceive o sbaglio ?

Sbagli! Se vuoi ottenere quello allora prova questo:
Codice (Java): [Seleziona]
@Override
public void onReceive(Context context, Intent intent)  {
    if (intent.getAction().equals(ACTION_ADD_NUMBER ))  {
        AppWidgetManager.getInstance() appWidgetManager = AppWidgetManager.getInstance();
        int[] appWidgetIds = appWidgetManager.getAppWidgetIds(new ComponentName(<inserisci quil il package che non conosco>, "Widget"));
        this.onUpdate(context, AppWidgetManager.getInstance() appWidgetManager, appWidgetIds)
    } else super.onReceive(context, intent);
}


Offline mimmog

  • Utente senior
  • ****
  • Post: 731
  • Respect: +11
    • MisterX_Dev
    • Mostra profilo
  • Dispositivo Android:
    Galaxy Note e Galaxy Nexus
  • Play Store ID:
    MisterX_Dev
  • Sistema operativo:
    Windows 7
Re:Button che aggiorna widget
« Risposta #8 il: 18 Aprile 2011, 21:55:09 CEST »
0
AAAAAA ancora non va!!! :( ho usato questo codice perchè il tuo aveva degli errori :)
Codice (Java): [Seleziona]
@Override
        public void onReceive(Context context, Intent intent) {
                if (intent.getAction().equals(ACTION_ADD_NUMBER ))  {
                        AppWidgetManager appWidgetManager = AppWidgetManager.getInstance(context);
                int[] appWidgetIds = appWidgetManager.getAppWidgetIds(new ComponentName("it.android.mio.widjetmio", "Widget"));
                onUpdate(context, appWidgetManager, appWidgetIds);
                }else{
                        super.onReceive(context, intent);
                }
        }

però ancora nada... :(

Offline MarcoDuff

  • Moderatore globale
  • Utente storico
  • *****
  • Post: 1073
  • Respect: +202
    • Google+
    • marcoduff
    • Mostra profilo
    • MarcoDuff's Blog
  • Dispositivo Android:
    Samsung Galaxy Nexus
  • Play Store ID:
    MarcoDuff
  • Sistema operativo:
    Windows 7
Re:Button che aggiorna widget
« Risposta #9 il: 18 Aprile 2011, 22:46:58 CEST »
+2
Ma che errori ti da? Il logcat che dice? Se vai in debug?

Offline mimmog

  • Utente senior
  • ****
  • Post: 731
  • Respect: +11
    • MisterX_Dev
    • Mostra profilo
  • Dispositivo Android:
    Galaxy Note e Galaxy Nexus
  • Play Store ID:
    MisterX_Dev
  • Sistema operativo:
    Windows 7
Re:Button che aggiorna widget
« Risposta #10 il: 18 Aprile 2011, 23:22:31 CEST »
0
Ma che errori ti da? Il logcat che dice? Se vai in debug?

Ho risolto Marco...porca zozza ho perso la testa...in pratica mettevo
Codice (Java): [Seleziona]
private static final String ACTION_ADD_NUMBER = "it.android.mio.widjetmio.ACTION_ADD_NUMBER";invece di
Codice (Java): [Seleziona]
private static final String ACTION_ADD_NUMBER = "it.android.mio.widjetmio.Widget.ACTION_ADD_NUMBER";
Rep + per te e grazie come sempre del tuo aiuto ! ;)