Autore Topic: Definire Overlay su MapView con onTap() ?!  (Letto 1466 volte)

Offline MMarko

  • Utente junior
  • **
  • Post: 128
  • Respect: +5
    • MarcoMatarazzi
    • Mostra profilo
    • La Rocchetta Bed And Breakfast
  • Dispositivo Android:
    HTC Legend
  • Play Store ID:
    MarcoMatarazzi
Definire Overlay su MapView con onTap() ?!
« il: 07 Ottobre 2010, 15:00:57 CEST »
0
Ciao a tutti,
seguendo il tutorial di JD ed aiutandomi con il libro di Carli sono riuscito a definire una classe che estende MapActivity, ho anche aggiunto una serie di segnaposti (puntine da disegno) in overlay sulla mappa per enfatizzare dei punti di interesse sulla mappa.

Per fare ciò ho definito mia classe "Mappa" che estende MapActivity e con il codice che incollo a seguire ho importato l'Overlay
Codice (Java): [Seleziona]
// Gestiamo gli Overlay
Drawable img = getResources().getDrawable(R.drawable.puntina);
PuntiInteresse overlays_interesse = new PuntiInteresse(img);

//sovrappongo l'Overlay
mapView.getOverlays().add(overlays_interesse);

Dopodichè ho definito la classe con i vari Marker
Codice (Java): [Seleziona]
public class PuntiInteresse extends ItemizedOverlay<OverlayItem>{
....
}


Tutto funziona bene! Le puntine sono al posto giusto.

Avendo visto che sul forum non è mai uscito fuori (correggetemi se sbaglio) il "problema" di rendere cliccabili le iconcine ho pensato di sollevare l'argomento.

La mia idea è una cosa del tipo:

Ossia premendo su un puntatore si apre una finestra con alcune informazioni circa il punto di interesse sfiorato.

Leggendo in giro mi pare di aver intuito che bisogna fare l'Override del metodo onTap() per fare in modo che allo sfioramento della puntina si avvii una finestra di notifica.
Qualcuno c'è gia passato? Avete qualche tutorial da segnalare?

Grazie :
« Ultima modifica: 07 Ottobre 2010, 15:03:37 CEST da MMarko »

Offline Ricky`

  • Amministratore
  • Utente storico
  • *****
  • Post: 3489
  • Respect: +506
    • Github
    • Google+
    • rciovati
    • Mostra profilo
Re:Definire Overlay su MapView con onTap() ?!
« Risposta #1 il: 07 Ottobre 2010, 16:14:51 CEST »
0
Leggendo in giro mi pare di aver intuito che bisogna fare l'Override del metodo onTap() per fare in modo che allo sfioramento della puntina si avvii una finestra di notifica.

Ottima intuizione. Hai provato a scrivere del codice? :)

Offline MMarko

  • Utente junior
  • **
  • Post: 128
  • Respect: +5
    • MarcoMatarazzi
    • Mostra profilo
    • La Rocchetta Bed And Breakfast
  • Dispositivo Android:
    HTC Legend
  • Play Store ID:
    MarcoMatarazzi
Re:Definire Overlay su MapView con onTap() ?!
« Risposta #2 il: 07 Ottobre 2010, 16:17:08 CEST »
0
Certamente ecco la classe:
Codice (Java): [Seleziona]
import java.util.LinkedList;
import java.util.List;

import android.graphics.Canvas;
import android.graphics.drawable.Drawable;
import com.google.android.maps.GeoPoint;
import com.google.android.maps.ItemizedOverlay;
import com.google.android.maps.MapView;
import com.google.android.maps.OverlayItem;



public class PuntiInteresse extends ItemizedOverlay<OverlayItem>{
       
        /*
         * Insieme degli item da visualizzare
         */

        private List<OverlayItem> interesse = new LinkedList<OverlayItem>();
        /*
         * Riferimento all'icona da utilizzare come Marker
         */

        private Drawable defaultMarker;

       
        public PuntiInteresse(Drawable defaultMarker) {
                super(defaultMarker);
               
                this.defaultMarker = defaultMarker;
               
                // Aggiungiamo ciascuna provincia come OverlayItem
                interesse.add(new OverlayItem(new GeoPoint(43400276,12963759),"le Grotte","frik"));
                interesse.add(new OverlayItem(new GeoPoint(43429915,12934974),"Genga","frik"));
                interesse.add(new OverlayItem(new GeoPoint(43402194,12967879),"Museo","frik"));

                populate();
        }
       
       
        @Override
        public void draw(Canvas canvas, MapView mapView, boolean shadow) {
                super.draw(canvas, mapView, shadow);
                boundCenterBottom(defaultMarker);              
        }
       

        /* (non-Javadoc)
         * @see com.google.android.maps.ItemizedOverlay#createItem(int)
         */

        @Override
        protected OverlayItem createItem(int i) {
                // Ritorniamo il riferimento all'i-esimo item
                return interesse.get(i);
        }

        @Override
        protected boolean onTap(int i) {
                Toast.makeText(???????, interesse.get(i).getSnippet(), Toast.LENGTH_SHORT).show();

        }
       

        /* (non-Javadoc)
         * @see com.google.android.maps.ItemizedOverlay#size()
         */

        @Override
        public int size() {
                // Numero di elementi
                return interesse.size();
        }
       
}


Nell'onTap volevo definire un intent, che ne dite?
« Ultima modifica: 07 Ottobre 2010, 16:18:46 CEST da MMarko »

Offline Ricky`

  • Amministratore
  • Utente storico
  • *****
  • Post: 3489
  • Respect: +506
    • Github
    • Google+
    • rciovati
    • Mostra profilo
Re:Definire Overlay su MapView con onTap() ?!
« Risposta #3 il: 07 Ottobre 2010, 16:21:36 CEST »
0
Basta passare il Context quando instanzi la tua classe ;)

Codice (Java): [Seleziona]
import java.util.LinkedList;
import java.util.List;

import android.graphics.Canvas;
import android.graphics.drawable.Drawable;
import android.content.Context;
import com.google.android.maps.GeoPoint;
import com.google.android.maps.ItemizedOverlay;
import com.google.android.maps.MapView;
import com.google.android.maps.OverlayItem;



public class PuntiInteresse extends ItemizedOverlay<OverlayItem>{
       
        /*
         * Insieme degli item da visualizzare
         */

        private List<OverlayItem> interesse = new LinkedList<OverlayItem>();
        /*
         * Riferimento all'icona da utilizzare come Marker
         */

        private Drawable defaultMarker;
        private Context mContext;
       
        public PuntiInteresse(Context context, Drawable defaultMarker) {
                super(defaultMarker);
                mContext = context;
                this.defaultMarker = defaultMarker;
               
                // Aggiungiamo ciascuna provincia come OverlayItem
                interesse.add(new OverlayItem(new GeoPoint(43400276,12963759),"le Grotte","frik"));
                interesse.add(new OverlayItem(new GeoPoint(43429915,12934974),"Genga","frik"));
                interesse.add(new OverlayItem(new GeoPoint(43402194,12967879),"Museo","frik"));

                populate();
        }
       
       
        @Override
        public void draw(Canvas canvas, MapView mapView, boolean shadow) {
                super.draw(canvas, mapView, shadow);
                boundCenterBottom(defaultMarker);              
        }
       

        /* (non-Javadoc)
         * @see com.google.android.maps.ItemizedOverlay#createItem(int)
         */

        @Override
        protected OverlayItem createItem(int i) {
                // Ritorniamo il riferimento all'i-esimo item
                return interesse.get(i);
        }

        @Override
        protected boolean onTap(int i) {
                Toast.makeText(mContext, interesse.get(i).getSnippet(), Toast.LENGTH_SHORT).show();

        }
       

        /* (non-Javadoc)
         * @see com.google.android.maps.ItemizedOverlay#size()
         */

        @Override
        public int size() {
                // Numero di elementi
                return interesse.size();
        }
       
}

Offline MMarko

  • Utente junior
  • **
  • Post: 128
  • Respect: +5
    • MarcoMatarazzi
    • Mostra profilo
    • La Rocchetta Bed And Breakfast
  • Dispositivo Android:
    HTC Legend
  • Play Store ID:
    MarcoMatarazzi
Re:Definire Overlay su MapView con onTap() ?!
« Risposta #4 il: 07 Ottobre 2010, 16:33:48 CEST »
0
Grazie! devo cercare di capire come funzionano i Context, comunque se scrivo nel metodo public PuntiInteresse(Context context, Drawable defaultMarker)

mContext = context;

mi da errore poichè la variabile "context" non è stata definita.

Se tolgo quel pezzo l'applicazione funziona ma premendo su un segnapunto crasha :)

Sto cercando di capire come funzionano le cose per evitare di fare passaggi in modo meccanico :P

Offline Ricky`

  • Amministratore
  • Utente storico
  • *****
  • Post: 3489
  • Respect: +506
    • Github
    • Google+
    • rciovati
    • Mostra profilo
Re:Definire Overlay su MapView con onTap() ?!
« Risposta #5 il: 07 Ottobre 2010, 16:38:41 CEST »
+1
La variabile context non serve definirla perchè è un parametro del costruttore.
Semmai devi dichiare quella mContext, che se noti nel mio esempio è un attributo della classe.

Comunque il codice scritto nei post è sempre il linea di massima, poi uno se lo deve aggiustare.

Offline MMarko

  • Utente junior
  • **
  • Post: 128
  • Respect: +5
    • MarcoMatarazzi
    • Mostra profilo
    • La Rocchetta Bed And Breakfast
  • Dispositivo Android:
    HTC Legend
  • Play Store ID:
    MarcoMatarazzi
Re:Definire Overlay su MapView con onTap() ?!
« Risposta #6 il: 07 Ottobre 2010, 16:58:36 CEST »
0
Verissimo, non mi ero accorto che avessi modificato il costruttore! :D
Comunque per qualche motivo non chiaro mi crasha ancora.

Ma per il momento la cosa che mi interessa chiedere è se l'intero passato come argomento del metodo onTap(int i) si riferisce all'indice del marker?

in altre parole posso dire che se i = 2 allora è stato premuto il marker 2 (o meglio, partendo da zero sarebbe il 3^ marker)? ??

e dipendendetemente dal valore assunto da i sarebbe possibile far partire un intent?

if ( i = 0) {
    Intent primo = new Intent(this, Inserisci.class);
    startActivity(primo);
} else if (i = 1) {
    Intent secondo = new Intent(this, Inserisci.class);
    startActivity(secondo);
}
eccetera?

Grazie! :D

Offline Ricky`

  • Amministratore
  • Utente storico
  • *****
  • Post: 3489
  • Respect: +506
    • Github
    • Google+
    • rciovati
    • Mostra profilo
Re:Definire Overlay su MapView con onTap() ?!
« Risposta #7 il: 07 Ottobre 2010, 17:09:50 CEST »
0
Citazione
Comunque per qualche motivo non chiaro mi crasha ancora.

Sicuramente tramite LogCat potrei avere qualche informazione in merito.

Citazione
Ma per il momento la cosa che mi interessa chiedere è se l'intero passato come argomento del metodo onTap(int i) si riferisce all'indice del marker?

Esatto... A quel punto puoi fare l'elaborazione che ti serve.


Offline MMarko

  • Utente junior
  • **
  • Post: 128
  • Respect: +5
    • MarcoMatarazzi
    • Mostra profilo
    • La Rocchetta Bed And Breakfast
  • Dispositivo Android:
    HTC Legend
  • Play Store ID:
    MarcoMatarazzi
Re:Definire Overlay su MapView con onTap() ?!
« Risposta #8 il: 07 Ottobre 2010, 17:48:02 CEST »
0
Adesso indipendentemente dall'intero, quindi dal marker premuto vorrei far aprire un'activity.

Definendo un Intent in questo modo:
Codice (Java): [Seleziona]
@Override
protected boolean onTap(int i) {               
        Intent myIntent = new Intent(mContext, destinazione.class);
        myIntent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
        mContext.startActivity(myIntent);              
return (true);
}

premendo ottengo una sorta di loop, il cui LogCat è il seguente:
Codice: [Seleziona]
10-07 15:41:07.149: WARN/WindowManager(52): Key dispatching timed out sending to com.app/com.destinazione.Parco
10-07 15:41:07.149: WARN/WindowManager(52): Dispatch state: {{KeyEvent{action=1 code=82 repeat=0 meta=0 scancode=229 mFlags=8} to Window{43c27c90 Keyguard paused=false} @ 1286466023082 lw=Window{43c27c90 Keyguard paused=false} lb=android.view.ViewRoot$W@43bf1fa8 fin=false gfw=true ed=true tts=0 wf=true fp=false mcf=Window{43cdfe80 com.app/com.destinazione.Parco paused=false}}}
10-07 15:41:07.155: WARN/WindowManager(52): Current state:  {{null to Window{43cdfe80 com.app/com.destinazione.Parco paused=false} @ 1286466067155 lw=Window{43cdfe80 com.app/com.destinazione.Parco paused=false} lb=android.os.BinderProxy@43d587e8 fin=false gfw=true ed=true tts=0 wf=false fp=false mcf=Window{43cdfe80 com.frasassi/com.destinazione.Parco paused=false}}}
10-07 15:41:07.155: WARN/WindowManager(52): Continuing to wait for key to be dispatched


Sbaglio la definizione dell'intent?  :-o

Offline MMarko

  • Utente junior
  • **
  • Post: 128
  • Respect: +5
    • MarcoMatarazzi
    • Mostra profilo
    • La Rocchetta Bed And Breakfast
  • Dispositivo Android:
    HTC Legend
  • Play Store ID:
    MarcoMatarazzi
Re:Definire Overlay su MapView con onTap() ?!
« Risposta #9 il: 10 Ottobre 2010, 23:43:01 CEST »
+1
Buona sera a tutti, posto per postare la soluzione al problema.

Il mio errore era un passaggio errato del Context, il mio errore banalissimo è stato quello di inviare alla classe "PuntiInteresse" un context sbagliato.

Confermo quindi che all'interno del metodo onTap() potete definire intent, Toast, finestre di notifica e chi piu ne ha piu ne metta.

Spero che questa mia piccola spiegazione possa evitare a qualcuno di perdere parecchie orette di lavoro :P