Autore Topic: ImageButton in una RemoteView  (Letto 983 volte)

Offline NanoAndroide

  • Utente junior
  • **
  • Post: 63
  • Respect: +3
    • Google+
    • Mostra profilo
    • MeToo
  • Dispositivo Android:
    GT-S5570
  • Play Store ID:
    MeToo
  • Sistema operativo:
    Windows 7
ImageButton in una RemoteView
« il: 01 Gennaio 2012, 18:07:26 CET »
0
Anzitutto, un Buon Anno a tutti!
Sono nuovo del forum ed alle prime esperienze con la programmazione di Android.
Veniamo al problema... :)

Ieri ho cominciato a lavorare su di un Widget che fa uso del GPS. Nel layout del widget, che ho chiamato semplicemente widget_layout, c'è un ImageButton che si chiama gps_button. Questo bottone ha (avrà) la funzione di attivare il GPS. Ora, nelle mie intenzioni, dovrebbe cambiare immagine (essenzialmente colore) in funzione dello stato del GPS.

Il bottone usa inizialmente una drawable chiamata gps_disable.
Quando viene premuto, in attesa che il GPS sia operativo, dovrebbe visualizzare una drawable chiamata gps_waiting.

Il problema è proprio questo: non riesco a cambiare l'immagine...

Questa è la mia classe AppWidgetProvider, epurata del codice superfluo:
Codice (Java): [Seleziona]
public class Widget extends AppWidgetProvider {
        //... definire una stringa per ogni azione che vogliamo eseguire...
        public static final String GPS_ACTION="my.package.name.GPS_ACTION";
       
        //aggiornamento del widget
        @Override
        public void onUpdate(Context ctx, AppWidgetManager wm, int[] widIds) {
                // ricavare gli ID dei vari componenti del widget
                ComponentName thisWidget = new ComponentName(ctx, Widget.class);
                int[] allWidgetIds = wm.getAppWidgetIds(thisWidget);
                for (int widgetId : allWidgetIds) {
                       
                        RemoteViews rv = new RemoteViews(ctx.getPackageName(),R.layout.widget_layout);                 

                        // ... qui c'è altro codice che non da problemi
                       
                        Intent i5= new Intent(ctx, Widget.class);
                        i5.setAction(Widget.GPS_ACTION);                       
                        PendingIntent pIntent5 = PendingIntent.getBroadcast(ctx,0, i5, PendingIntent.FLAG_UPDATE_CURRENT);
                        rv.setOnClickPendingIntent(R.id.gps_button, pIntent5);
                       
                        wm.updateAppWidget(widgetId, rv);                      
                }
        }
       
        @Override
        public void onReceive(Context context, Intent intent) {
               
        ...

            if (intent.getAction().equals(GPS_ACTION)) {
               
                Toast.makeText(context, "Toccato GPS", Toast.LENGTH_SHORT).show();
                RemoteViews rv=new RemoteViews(context.getPackageName(), R.id.gps_button);
                rv.setImageViewResource(R.id.gps_button, R.drawable.gps_waiting);

            }
           
            super.onReceive(context, intent);
           
        }
       
}

Nel metodo onReceive c'è un toast che ho usato solo per vedere se il tap veniva registrato... e quello va...

Visto che il resto del widget funziona, presumo che il problema sia una cavolata, qualcosa di così banale che non riesco a vederla...  :-o

Ringrazio anticipatamente chi riuscirà a darmi l'imbeccata giusta!

Zate

  • Visitatore
Re:ImageButton in una RemoteView
« Risposta #1 il: 01 Gennaio 2012, 18:49:06 CET »
0
Potrei sbagliarmi, ma non dovresti mettere
Codice (Java): [Seleziona]
wm.updateAppWidget(widgetId, rv);                       Dopo rv.setImageViewResource?

Offline NanoAndroide

  • Utente junior
  • **
  • Post: 63
  • Respect: +3
    • Google+
    • Mostra profilo
    • MeToo
  • Dispositivo Android:
    GT-S5570
  • Play Store ID:
    MeToo
  • Sistema operativo:
    Windows 7
Re:ImageButton in una RemoteView
« Risposta #2 il: 01 Gennaio 2012, 19:19:56 CET »
0
Mmm... ho provato, ma devo aver sbagliato qualcosa nel recuperare l'id del widget ed ho ottenuto solo un bell'errore:

LogCat:

01-01 18:11:43.322: W/dalvikvm(310): threadid=1: thread exiting with uncaught exception (group=0x4001d800)
01-01 18:11:43.341: E/AndroidRuntime(310): FATAL EXCEPTION: main
01-01 18:11:43.341: E/AndroidRuntime(310): java.lang.RuntimeException: Unable to start receiver my.app.name.widget.Widget: java.lang.ArrayIndexOutOfBoundsException
01-01 18:11:43.341: E/AndroidRuntime(310):    at android.app.ActivityThread.handleReceiver(ActivityThread.java:2821)
01-01 18:11:43.341: E/AndroidRuntime(310):    at android.app.ActivityThread.access$3200(ActivityThread.java:125)
01-01 18:11:43.341: E/AndroidRuntime(310):    at android.app.ActivityThread$H.handleMessage(ActivityThread.java:2083)
01-01 18:11:43.341: E/AndroidRuntime(310):    at android.os.Handler.dispatchMessage(Handler.java:99)
01-01 18:11:43.341: E/AndroidRuntime(310):    at android.os.Looper.loop(Looper.java:123)
01-01 18:11:43.341: E/AndroidRuntime(310):    at android.app.ActivityThread.main(ActivityThread.java:4627)
01-01 18:11:43.341: E/AndroidRuntime(310):    at java.lang.reflect.Method.invokeNative(Native Method)
01-01 18:11:43.341: E/AndroidRuntime(310):    at java.lang.reflect.Method.invoke(Method.java:521)
01-01 18:11:43.341: E/AndroidRuntime(310):    at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:868)
01-01 18:11:43.341: E/AndroidRuntime(310):    at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:626)
01-01 18:11:43.341: E/AndroidRuntime(310):    at dalvik.system.NativeStart.main(Native Method)
01-01 18:11:43.341: E/AndroidRuntime(310): Caused by: java.lang.ArrayIndexOutOfBoundsException
01-01 18:11:43.341: E/AndroidRuntime(310):    at my.app.name.widget.Widget.onUpdate(Widget.java:38)
01-01 18:11:43.341: E/AndroidRuntime(310):    at android.appwidget.AppWidgetProvider.onReceive(AppWidgetProvider.java:61)
01-01 18:11:43.341: E/AndroidRuntime(310):    at my.app.name.widget.Widget.onReceive(Widget.java:61)
01-01 18:11:43.341: E/AndroidRuntime(310):    at android.app.ActivityThread.handleReceiver(ActivityThread.java:2810)
01-01 18:11:43.341: E/AndroidRuntime(310):    ... 10 more


Più tardi riprovo... per ora grazie! :)

Offline NanoAndroide

  • Utente junior
  • **
  • Post: 63
  • Respect: +3
    • Google+
    • Mostra profilo
    • MeToo
  • Dispositivo Android:
    GT-S5570
  • Play Store ID:
    MeToo
  • Sistema operativo:
    Windows 7
Re:ImageButton in una RemoteView
« Risposta #3 il: 01 Gennaio 2012, 23:03:08 CET »
0
Niente da fare, anche con .updateAppWidget(widgetId, rv) l'immagine non cambia... non mi da nessun errore (quello di prima era dovuto ad una svista...  :-[ ), logcat pulito, semplicemente l'immagine non cambia...  :-(

Zate

  • Visitatore
Re:ImageButton in una RemoteView
« Risposta #4 il: 01 Gennaio 2012, 23:21:01 CET »
0
Per caso aggiorni già il widget con un alarm manager? setOnClickPendingIntent è nell'onUpdate. Teoricamente un widget si può aggiornare soltanto ogni 1800000 millisecondi (30 minuti). Mettendo il setOnClickPendingIntent nell'onUpdate l'image button sarà funzionante solo dopo 30 minuti. Se non ricordo male reinstallando l'app (sempre da eclipse) un'altra volta lasciando il widget sulla home, questo si dovrebbe aggiornare (e quindi l'imagebutton dovrebbe diventare funzionante).

Offline NanoAndroide

  • Utente junior
  • **
  • Post: 63
  • Respect: +3
    • Google+
    • Mostra profilo
    • MeToo
  • Dispositivo Android:
    GT-S5570
  • Play Store ID:
    MeToo
  • Sistema operativo:
    Windows 7
Re:ImageButton in una RemoteView
« Risposta #5 il: 02 Gennaio 2012, 00:42:53 CET »
0
Per caso aggiorni già il widget con un alarm manager? setOnClickPendingIntent è nell'onUpdate. Teoricamente un widget si può aggiornare soltanto ogni 1800000 millisecondi (30 minuti). Mettendo il setOnClickPendingIntent nell'onUpdate l'image button sarà funzionante solo dopo 30 minuti. Se non ricordo male reinstallando l'app (sempre da eclipse) un'altra volta lasciando il widget sulla home, questo si dovrebbe aggiornare (e quindi l'imagebutton dovrebbe diventare funzionante).

Niente da fare: anche reinstallando come dici, l'immagine non si aggiorna...  :-(
Questo problema mi pare strano... se aggiorno con un meccanismo simile una textview, il testo lo aggiorna subito, al click...  :-\
Proverò ad aggiornare un altro tipo di contenuto, magari sono antipatico agli ImageButton...  :-P

Zate

  • Visitatore
Re:ImageButton in una RemoteView
« Risposta #6 il: 02 Gennaio 2012, 10:57:31 CET »
0
Prova così:
Codice (Java): [Seleziona]
rv.setInt(R.id.gps_button, "setImageResource", R.drawable.gps_waiting);RemoteViews | Android Developers

Offline NanoAndroide

  • Utente junior
  • **
  • Post: 63
  • Respect: +3
    • Google+
    • Mostra profilo
    • MeToo
  • Dispositivo Android:
    GT-S5570
  • Play Store ID:
    MeToo
  • Sistema operativo:
    Windows 7
Re:ImageButton in una RemoteView
« Risposta #7 il: 02 Gennaio 2012, 21:35:34 CET »
0
L'avevo già provato, niente da fare...  :-(
Per il momento uso un bottone normale, senza immagine... poi vedo di trovare una soluzione funzionante... Grazie comunque!