Behöver kod-hjälp med uppdatering av widget!

Diskussion i 'Frågor, support och diskussion' startad av Summered, 14 nov 2010.

  1. Summered

    Summered Teen Droid Medlem

    Blev medlem:
    11 jan 2010
    Inlägg:
    302
    Mottagna gillanden:
    17

    MINA ENHETER

    Tjenare alla glada (och ni andra surpuppor ;))!

    Jag behöver hjälp med en widget jag håller på med. Det ska föreställa en digitalklocka, och jag har kommit så långt att jag har fastnat på själva uppdateringen av den.

    Så här ser Widget-klassen ut:
    Kod:
    public class Widget extends AppWidgetProvider{ 
    	Images im = new Images();
    	
        public void onReceive(Context context, Intent intent){    	
            String action = intent.getAction();
            if(AppWidgetManager.ACTION_APPWIDGET_UPDATE.equals(action)){
            	
                im.update();
                RemoteViews views = new RemoteViews(context.getPackageName(), R.layout.widget);
    
                Intent AlarmClockIntent = new Intent(Intent.ACTION_MAIN).addCategory(Intent.CATEGORY_LAUNCHER).setComponent(new ComponentName("com.android.alarmclock", "com.android.alarmclock.AlarmClock"));
                PendingIntent pendingIntent = PendingIntent.getActivity(context, 0, AlarmClockIntent, 0);
                views.setOnClickPendingIntent(R.id.Widget, pendingIntent);
                                        
                AppWidgetManager.getInstance(context).updateAppWidget(intent.getIntArrayExtra(AppWidgetManager.EXTRA_APPWIDGET_IDS), views);
            }
        }
    
    }
    och Images klassen:
    Kod:
    public class Images{
    	Klockan kl = new Klockan();
    	Bitmap[] bMap = new Bitmap[11];
    	private Context ctx;
    	private ImageView[] image = new ImageView[5];
    	
    	public Images(){}
    	
    	public Images(Context ctx){
    		this.ctx = ctx;
    		// Initialisering av imageviews och bitmaps
    	    }
    	}
    	
    	public void update(){	    
    	    for(int i=0; i < image.length;i++){
    	    	int n = Character.getNumericValue((kl.getSplitTimeChar()[i]));
    	    	if(n == -1)
    	    		image[i].setImageBitmap(bMap[10]);
    	    	else
    	    		image[i].setImageBitmap(bMap[n]);
    	    } 
    	}
    }
    
    Sedan tänkte jag passa på att fråga om det går att underlätta detta:
    Kod:
    image[0] = (ImageView) findViewById(R.id.slot1);
    image[1] = (ImageView) findViewById(R.id.slot2);
    Det går ju inte att bara göra en for-loop med "slot"+i då R.id.slot1 är en int, så hur kan jag gå till väga där?

    Huvudfrågan är dock hur jag ska göra uppdateringen och (antagligen relaterat) en force close vid laddningen.

    Jag har provat att ändra android:updatePeriodMillis men jag antar att det är något fel vid laddningen av bilderna som orsakar force close och som gör att det inte sker någon uppdatering.

    Blev kanske virrigt men jag hoppas att meddelandet går fram.
     
  2. Kaj

    Kaj Senior Droid Medlem

    Blev medlem:
    12 jun 2009
    Inlägg:
    1 768
    Mottagna gillanden:
    44

    MINA ENHETER

    Har inte tillgång till min widget kod just nu, men i SDK:n finns det widget exempel som visar hur du skall uppdatera vyn. Tycker inte att jag känner igen din kod, men i Snowstorm så delegerar jag allt arbete till en bakgrundstjänst. Tror nästan att du också vill göra det iom att klockan inte ska köra när skärmen är släckt. Om ingen annan givit ett bättre svar innan jag kommer hem ikväll så kan jag ev kolla koden då.

    Angående din andra fråga så kan du lägga dina id:n i en array.

    Kod:
    int[] ids = new int[] { R.id.slot1, R.id.slot2 };
    
    Sedan är det bara att loopa
     
  3. Summered

    Summered Teen Droid Medlem

    Blev medlem:
    11 jan 2010
    Inlägg:
    302
    Mottagna gillanden:
    17

    MINA ENHETER

    Jo, jag tänkte kolla igenom exemplet i SDK:n och se om jag hittar något intressant där.

    Tack för idén med en array för id:n, så enkelt det kan vara egentligen :)

    EDIT:
    Jag får inte ImageView.setBitmapResource(Bitmap) att fungera, det händer helt enkelt ingenting.
    Dvs, bilderna är statiska med det värdet jag har gett dem i .xml-filen.
     
    Last edited: 15 nov 2010
  4. Kaj

    Kaj Senior Droid Medlem

    Blev medlem:
    12 jun 2009
    Inlägg:
    1 768
    Mottagna gillanden:
    44

    MINA ENHETER

    När jag i Snowstorm skall visa väderikoner i widgeten så gör jag på två sätt.
    1) Om man inte har valt ett skin så använder jag en resurs:
    views.setImageViewResource(viewId, resourceId);

    2) Om man valt ett skin och jag har laddat en Bitmap:
    views.setImageViewBitmap(viewId, bitmap);
     
  5. Summered

    Summered Teen Droid Medlem

    Blev medlem:
    11 jan 2010
    Inlägg:
    302
    Mottagna gillanden:
    17

    MINA ENHETER

    Jag känner mig lite bakom flötet, men vilket är viewId? Försökte kolla i API:t men stod ingen vidare förklaring :P

    Har just nu
    Kod:
    image[i].setImageBitmap(bMap[n]);
    Där arrayen image är en ImageView.
    Ska det se ut något liknande?
    Kod:
    image[i].setImageViewResource(??, bMap[n]);
    Provade allt möjligt under viewId; for-loopens index, image, min ViewGroup men ingenting fungerade. Att casta med (viewId) gick ej heller för sig.

    Tack för att du tar dig tid förresten :)

    EDIT:
    Provade även R.id.slot1 (eller min id-array då) men den returnerar en int och det klagar Eclipse på.
     
    Last edited: 15 nov 2010
  6. Kaj

    Kaj Senior Droid Medlem

    Blev medlem:
    12 jun 2009
    Inlägg:
    1 768
    Mottagna gillanden:
    44

    MINA ENHETER



    views i mitt exempel var min RemoteViews, så det är på den som jag anropar metoderna jag pratade om. viewId är det id som min ImageView har i den layout som RemoteViews just nu visar. (Det är alltså t.ex R.id.icon1).
     
  7. Summered

    Summered Teen Droid Medlem

    Blev medlem:
    11 jan 2010
    Inlägg:
    302
    Mottagna gillanden:
    17

    MINA ENHETER

    Tack, det fungerar nu :)

    En fråga angående uppdatering av widget. Som jag förstår är det en gräns på 30 minuter för den frekvens som finns i .xml-filen?

    Just nu använder jag Javas timer och undrar om det finns något mer effektivt sätt att lösa det på? :)

    Hela programmet fungerar dock inte, men den uppdaterar iaf en gång :P
     
    Last edited: 15 nov 2010
  8. Kaj

    Kaj Senior Droid Medlem

    Blev medlem:
    12 jun 2009
    Inlägg:
    1 768
    Mottagna gillanden:
    44

    MINA ENHETER

    Jag har aldrig använt uppdateringsfrekvensen som anger i xml-filen. Jag schedulerar alltid en körning med Androids AlarmManager. När en körning är klar schedulerar jag ett nytt alarm.
     
  9. Summered

    Summered Teen Droid Medlem

    Blev medlem:
    11 jan 2010
    Inlägg:
    302
    Mottagna gillanden:
    17

    MINA ENHETER

    Får googla lite på det då, tack :)