Widget + knappar = problem

Diskussion i 'Frågor, support och diskussion' startad av rickardx, 30 jun 2010.

  1. rickardx

    rickardx Kid Droid Medlem

    Blev medlem:
    30 jun 2010
    Inlägg:
    98
    Mottagna gillanden:
    0
    Operatör:
    Tele2
    Telefon:
    Samsung Galaxy Note 4

    MINA ENHETER

    Operatör:
    Tele2
    Telefon:
    Samsung Galaxy Note 4
    Telefon 2:
    Samsung Galaxy S4
    Platta:
    Sony Xperia Z2
    Håller på att bygga en widget som består av fem knappar. Till det använder jag RemoteViews, Intent, PendingIntent för att kunna styra vad som ska hända.

    När en knapp är klickad så förflyttas man till en ny "view" (från AppWidgetProvider till MapActivity) där en karta ska visas, vilket den gör. Men jag vill kunna visa olika saker beroende på vilken knapp som klickats. Jag har förtvivlat försökt ta reda på hur jag ska kunna fånga upp vilken knapp som klickats utan att lyckas. Hur gör man?
     
  2. woody

    woody Teen Droid Medlem

    Blev medlem:
    3 sept 2009
    Inlägg:
    319
    Mottagna gillanden:
    19

    MINA ENHETER

    Jag vet inte om jag förstod problemet. Du har väl olika Intent och PendingIntent för de olika knapparna och så är det väl bara att lägga till olika extradata beroende på vilken knapp det är.

    Så här ser min kod ut (två knappar som förvisso öppnar olika activvities)
    Kod:
            Intent overviewIntent = new Intent(context, OverviewActivity.class);
            PendingIntent pendingOverviewIntent = PendingIntent.getActivity(context, 0, overviewIntent, 0);
            views.setOnClickPendingIntent(R.id.ButtonShowOverview, pendingOverviewIntent);
            
            Intent updateSettingIntent = new Intent(context, AutoUpdateSettingActivity.class);
            PendingIntent pendingUpdateSettingIntent = PendingIntent.getActivity(context, 0, updateSettingIntent, 0);
            views.setOnClickPendingIntent(R.id.ButtonUpdate, pendingUpdateSettingIntent);
            
     
  3. rickardx

    rickardx Kid Droid Medlem

    Blev medlem:
    30 jun 2010
    Inlägg:
    98
    Mottagna gillanden:
    0
    Operatör:
    Tele2
    Telefon:
    Samsung Galaxy Note 4

    MINA ENHETER

    Operatör:
    Tele2
    Telefon:
    Samsung Galaxy Note 4
    Telefon 2:
    Samsung Galaxy S4
    Platta:
    Sony Xperia Z2
    Tack för ditt svar woody!

    Jag var lite otydlig första gången jag skrev och jag borde ha bifogat lite kod. Jag gör ett nytt försök nedan:
    Den första delen med RemoteViews, Intent och PendingIntent har jag gjort även om jag är osäker på om jag behöver ett PendingIntent per knapp eller om det räcker med med ett eftersom det enda jag behöver få ut senare är vilken knapp som triggade händelsen.
    I mitt exempel nedan tänker jag mig att jag har fem olika knappar på hemskärmen och beroende på vilken knapp jag klickar på så får jag upp en karta där zoomningsgraden är olika, dvs de olika knapparna ska ge olika värden till MapControllerns setZoom.
    Kod:
    @Override
    public void onUpdate(Context context, AppWidgetManager appWidgetManager, int[] appWidgetIds) {
    
       RemoteViews remoteViews = new RemoteViews(context.getPackageName(), R.layout.main);
    
       Intent buttonIntent = new Intent(context, ShowMap.class);
       buttonIntent.setAction(ACTION_WIDGET_SHOWMAP);
    		
       PendingIntent buttonPendingIntent = PendingIntent.getActivity(context, 0, buttonIntent, 0);
    		
       remoteViews.setOnClickPendingIntent(R.id.button_one, buttonPendingIntent);
       remoteViews.setOnClickPendingIntent(R.id.button_two, buttonPendingIntent);
       remoteViews.setOnClickPendingIntent(R.id.button_three, buttonPendingIntent);
       remoteViews.setOnClickPendingIntent(R.id.button_four, buttonPendingIntent);
       remoteViews.setOnClickPendingIntent(R.id.button_five, buttonPendingIntent);
    
       appWidgetManager.updateAppWidget(appWidgetIds, remoteViews);
    }
    Efter klicket anropas nedanstående kod i klassen/filen ShowMap:
    Kod:
    public class ShowMap extends MapActivity {
    
       private MapView mapView;
       private MapController mapController;
       @Override
       public void onCreate(Bundle savedInstanceState) {
          super.onCreate(savedInstanceState);
    
          setContentView(R.layout.maplayout);
          mapView = (MapView) findViewById(R.id.map_view);
          mapView.setStreetView(true);
          mapView.setSatellite(true);
          mapController = mapView.getController();
    
          // Om knapp ett är klickat så får setZoom ett värde
          mapController.setZoom(1);
    
          // Om knapp två är klickat så får setZoom ett annat värde
          mapController.setZoom(3);
    
          // Om knapp tre är klickat så får setZoom ett annat värde
          mapController.setZoom(7);
    
          // Om knapp fyra är klickat så får setZoom ett annat värde
          mapController.setZoom(12);
    
          // Om knapp fem är klickat så får setZoom ett annat värde
          mapController.setZoom(15);
    }
    Jag undrar alltså, hur tar jag reda på vilken av de fem knapparna som klickats innan jag kom till kartan så att jag kan använda den infon till en villkorssats?
     
  4. Kaj

    Kaj Senior Droid Medlem

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

    MINA ENHETER

    Alltså, du skapar en ny intent/pending intent instans per knapp. Varje intent kan se ut enligt:
    Kod:
    Intent buttonIntent = new Intent(context, ShowMap.class);
    .. men du "bifogar" sedan olika data för varje intent genom att t.ex
    Kod:
    buttonIntent .putExtra("zoomlevel", aValue);
    I ShowMap kan du sedan kolla på extra för att få reda på vilken zoomlevel som skall visas.

    (Detta är en förtydligan av vad jag tror woody sade, och det är vad jag skulle ha gjort)
     
  5. rickardx

    rickardx Kid Droid Medlem

    Blev medlem:
    30 jun 2010
    Inlägg:
    98
    Mottagna gillanden:
    0
    Operatör:
    Tele2
    Telefon:
    Samsung Galaxy Note 4

    MINA ENHETER

    Operatör:
    Tele2
    Telefon:
    Samsung Galaxy Note 4
    Telefon 2:
    Samsung Galaxy S4
    Platta:
    Sony Xperia Z2
    Tack så mycket Kaj!

    Jag misslyckades återigen få med väsentliga detaljer i mitt inlägg. Jag har inte lyckats få till det där med att plocka ut infon som skickats med med hjälp av putExtra. Hur kommer jag åt det så att jag kan använda det?
     
  6. woody

    woody Teen Droid Medlem

    Blev medlem:
    3 sept 2009
    Inlägg:
    319
    Mottagna gillanden:
    19

    MINA ENHETER

    I onCreate kommr du åt Intentet med metoden getIntent

    Kod:
    public class ShowMap extends MapActivity {
    
       private MapView mapView;
       private MapController mapController;
       @Override
       public void onCreate(Bundle savedInstanceState) {
          super.onCreate(savedInstanceState);
    
          setContentView(R.layout.maplayout);
          mapView = (MapView) findViewById(R.id.map_view);
          mapView.setStreetView(true);
          mapView.setSatellite(true);
          mapController = mapView.getController();
    
    [B]      int defaultZoom = 0;
          int zoomLevel = getIntent().getIntExtra("zoomlevel",defaultZoom);
    [/B]
          mapController.setZoom(zoomLevel);
    
    }
    
     
  7. rickardx

    rickardx Kid Droid Medlem

    Blev medlem:
    30 jun 2010
    Inlägg:
    98
    Mottagna gillanden:
    0
    Operatör:
    Tele2
    Telefon:
    Samsung Galaxy Note 4

    MINA ENHETER

    Operatör:
    Tele2
    Telefon:
    Samsung Galaxy Note 4
    Telefon 2:
    Samsung Galaxy S4
    Platta:
    Sony Xperia Z2
    Yes! Precis det jag var ute efter. :)

    Frustrerande att inte komma vidare på grund av så banala problem, men nu är det full fart framåt.

    Stort tack för den snabba hjälpen, jag är väldigt tacksam!
     
  8. asperon

    asperon Adult Droid Medlem

    Blev medlem:
    6 aug 2009
    Inlägg:
    586
    Mottagna gillanden:
    94
    Operatör:
    Tele2
    Telefon:
    Pixel 6

    MINA ENHETER

    Operatör:
    Tele2
    Telefon:
    Pixel 6
    Värt att notera är att android "återanvänder" intent som är likadana (och då tittar det inte på extras), så se till att ge varje knapps intent ett unikt namn.
     
  9. rickardx

    rickardx Kid Droid Medlem

    Blev medlem:
    30 jun 2010
    Inlägg:
    98
    Mottagna gillanden:
    0
    Operatör:
    Tele2
    Telefon:
    Samsung Galaxy Note 4

    MINA ENHETER

    Operatör:
    Tele2
    Telefon:
    Samsung Galaxy Note 4
    Telefon 2:
    Samsung Galaxy S4
    Platta:
    Sony Xperia Z2
    Nähäpp, nu har jag suttit länge och försökt få till det som jag trodde att jag hade koll på, men det skiter sig.

    zoomLevel (som använts ovan) får alltid samma värde och det är det värde som deklarerats först. Om jag till Knapp etts intent har lagt till putExtra("zoomlevel", 1) och till Knapp tvås intent putExtra("zoomlevel", 2) osv. så får zoomLevel värdet 1 oavsett vilken knapp jag klickar på.
    Om jag kommenterar bort allt som har med Knapp ett att göra så får zoomLevel värdet 2 och så vidare.
    Vad gör jag för fel?

    Kod:
    Intent buttonOneIntent = new Intent(context, ShowMap.class);
    buttonOneIntent.putExtra("zoomlevel", 1);
    PendingIntent pendingButtonOneIntent = PendingIntent.getActivity(context, 0, buttonOneIntent, 0);
    remoteViews.setOnClickPendingIntent(R.id.button_one, pendingButtonOneIntent);
    		
    Intent buttonTwoIntent = new Intent(context, ShowMap.class);
    buttonTwoIntent.putExtra("zoomlevel", 2);
    PendingIntent pendingButtonTwoIntent = PendingIntent.getActivity(context, 0, buttonTwoIntent, 0);
    remoteViews.setOnClickPendingIntent(R.id.button_two, pendingButtonTwoIntent);
    		
    Intent buttonThreeIntent = new Intent(context, ShowMap.class);
    buttonThreeIntent.putExtra("zoomlevel", 3);
    PendingIntent pendingButtonThreeIntent = PendingIntent.getActivity(context, 0, buttonThreeIntent, 0);
    remoteViews.setOnClickPendingIntent(R.id.button_three, pendingButtonThreeIntent);
    		
    Intent buttonFourIntent = new Intent(context, ShowMap.class);
    buttonFourIntent.putExtra("zoomlevel", 4);
    PendingIntent pendingButtonFourIntent = PendingIntent.getActivity(context, 0, buttonFourIntent, 0);
    remoteViews.setOnClickPendingIntent(R.id.button_four, pendingButtonFourIntent);
    		
    Intent buttonFiveIntent = new Intent(context, ShowMap.class);
    buttonFiveIntent.putExtra("zoomlevel", 5);
    PendingIntent pendingButtonFiveIntent = PendingIntent.getActivity(context, 0, buttonFiveIntent, 0);
    remoteViews.setOnClickPendingIntent(R.id.button_five, pendingButtonFiveIntent);
    respektive

    Kod:
    int defaultZoom = 0;
    int zoomLevel = getIntent().getIntExtra("zoomlevel", defaultZoom);
     
  10. Kaj

    Kaj Senior Droid Medlem

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

    MINA ENHETER

    Det du råkat ut för är precis det som asperon varnade för. Ditt anrop till PendingIntent.getActivity retunerar samma PendingIntent varje gång.

    Från dokumentationen för PendingIntent:

    PendingIntent itself will remain usable from other processes that have been given it. If the creating application later re-retrieves the same kind of PendingIntent (same operation, same Intent action, data, categories, and components, and same flags), it will receive a PendingIntent representing the same token if that is still valid, and can thus call cancel() to remove it.

    Testa att använda setData på dina intents för att göra dem unika.
     
  11. rickardx

    rickardx Kid Droid Medlem

    Blev medlem:
    30 jun 2010
    Inlägg:
    98
    Mottagna gillanden:
    0
    Operatör:
    Tele2
    Telefon:
    Samsung Galaxy Note 4

    MINA ENHETER

    Operatör:
    Tele2
    Telefon:
    Samsung Galaxy Note 4
    Telefon 2:
    Samsung Galaxy S4
    Platta:
    Sony Xperia Z2
    Jag trodde att jag var "säker" när jag gav respektive intent ett unikt namn. Men då ska jag kolla upp hur jag ska använda setData och se om det löser mina problem.
    Tack Kaj!
     
  12. Kaj

    Kaj Senior Droid Medlem

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

    MINA ENHETER

    Det asperon menade med olika namn var inte variabelnamn :)
     
  13. rickardx

    rickardx Kid Droid Medlem

    Blev medlem:
    30 jun 2010
    Inlägg:
    98
    Mottagna gillanden:
    0
    Operatör:
    Tele2
    Telefon:
    Samsung Galaxy Note 4

    MINA ENHETER

    Operatör:
    Tele2
    Telefon:
    Samsung Galaxy Note 4
    Telefon 2:
    Samsung Galaxy S4
    Platta:
    Sony Xperia Z2
    Nä, det borde jag iofs förstått. Jag har letat efter något som har med unikt id att göra och inte hittat något så jag drog slutsatsen att det var variabelnamn han menade, men det var det ju inte såklart.

    Inser att jag tagit mig vatten över huvudet och bör kanske släppa detta nu. Jag förstår inte hur jag ska göra och hittar inga exempel att använda. För att använda setData krävdes det mer kunskap än jag först uppfattade.
    Tyckte att jag borde klara något så basic som händelsehantering, men jag känner mig lika vilsen som första veckan i första klass i skolan. Tillbaks till ruta ett helt enkelt. : )

    Tack för visat tålamod!
     
  14. Kaj

    Kaj Senior Droid Medlem

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

    MINA ENHETER

    Att använda setData behöver ev inte vara svårt. Tror du kan stoppa in vad du vill som är en URI, du kommer ju ändå strunta i värdet som är där.

    Testa bara att stoppa in t.ex:
    Kod:
    buttonOneIntent.setData(Uri.parse("http://doesntmatter.com/zoomlevel/1"));
    
    ..
    ..
    Kod:
    buttonTwoIntent.setData(Uri.parse("http://doesntmatter.com/zoomlevel/2"));

    Edit: Helt otestat, och det var ett tag sedan jag använde setData
     
  15. rickardx

    rickardx Kid Droid Medlem

    Blev medlem:
    30 jun 2010
    Inlägg:
    98
    Mottagna gillanden:
    0
    Operatör:
    Tele2
    Telefon:
    Samsung Galaxy Note 4

    MINA ENHETER

    Operatör:
    Tele2
    Telefon:
    Samsung Galaxy Note 4
    Telefon 2:
    Samsung Galaxy S4
    Platta:
    Sony Xperia Z2
    Wow!
    Det funkade ju perfekt. Jag började läsa om Uri, intent filters och trodde att det var betydligt krångligare än så här. Men jag hade aldrig löst det själv utan hjälpen jag fått här.

    Tack så mycket! Om du/ni ska på Android Only i oktober så ska jag bjuda på öl i baren på Anglais.
     
  16. rickardx

    rickardx Kid Droid Medlem

    Blev medlem:
    30 jun 2010
    Inlägg:
    98
    Mottagna gillanden:
    0
    Operatör:
    Tele2
    Telefon:
    Samsung Galaxy Note 4

    MINA ENHETER

    Operatör:
    Tele2
    Telefon:
    Samsung Galaxy Note 4
    Telefon 2:
    Samsung Galaxy S4
    Platta:
    Sony Xperia Z2
    Ville tacka än en gång för hjälpen. I fredags fick jag ut mitt första bidrag på Market, den widget som jag fick er hjälp med. Den är enkel i sitt utförande, men jag kommer att jobba vidare på konceptet vartefter jag lär mig mer.
    Feeback tas tacksamt emot.

    [​IMG]
     
    Last edited: 18 jul 2010
  17. Adevade

    Adevade Youth Droid Medlem

    Blev medlem:
    14 apr 2010
    Inlägg:
    135
    Mottagna gillanden:
    2

    MINA ENHETER

    Gör gärna QR-koden klickbar, så att man även kan följa länken om man surfar i telefonen :)
     
  18. rickardx

    rickardx Kid Droid Medlem

    Blev medlem:
    30 jun 2010
    Inlägg:
    98
    Mottagna gillanden:
    0
    Operatör:
    Tele2
    Telefon:
    Samsung Galaxy Note 4

    MINA ENHETER

    Operatör:
    Tele2
    Telefon:
    Samsung Galaxy Note 4
    Telefon 2:
    Samsung Galaxy S4
    Platta:
    Sony Xperia Z2
    @Adevade: QR-koden är numera klickbar.
     
  19. Kaj

    Kaj Senior Droid Medlem

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

    MINA ENHETER

    Vad heter appen på market?
     
  20. rickardx

    rickardx Kid Droid Medlem

    Blev medlem:
    30 jun 2010
    Inlägg:
    98
    Mottagna gillanden:
    0
    Operatör:
    Tele2
    Telefon:
    Samsung Galaxy Note 4

    MINA ENHETER

    Operatör:
    Tele2
    Telefon:
    Samsung Galaxy Note 4
    Telefon 2:
    Samsung Galaxy S4
    Platta:
    Sony Xperia Z2
    Den heter "Vart finns...", men det blir ett nytt namn till kommande version eftersom namnet är ganska impopulärt.