IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Android Discussion :

[Google Code] Récupérer lat/long depuis un Zoom GoogleMap


Sujet :

Android

  1. #1
    Nouveau membre du Club
    Inscrit en
    Novembre 2010
    Messages
    40
    Détails du profil
    Informations forums :
    Inscription : Novembre 2010
    Messages : 40
    Points : 28
    Points
    28
    Par défaut [Google Code] Récupérer lat/long depuis un Zoom GoogleMap
    EDIT : Vu que j'ai rencontré plusieurs problème pour la raison du poste (récupérer la latitude et la longitude avec la map Google), je met les différents points qui ont posé problème et leur solution. A la fin de ce message le code complet de mes deux classes utilisé pour l'affichage de la carte Google et pour dessiner par dessus.

    Problème de base :
    - Récupérer les informations de lat/long dans une 3ème classe qui lancerais via un bouton la classe Map (ici LocActivity)

    Ce qui a été fait :
    - Afficher la map
    - Créer et Afficher un marqueur
    - Effacer le marqueur présent lorsqu'on pose un nouveau marqueur
    - Effacer le marqueur présent
    - Afficher la position du marqueur dans une AlertDialog ou un Toast (affichage simple)

    Voilà ça fait pas grand chose. Pour réaliser ceci j'ai utilisé
    - http://developer.android.com/resourc...o-mapview.html
    - Recherche Google
    - La précieuse aide de dawadam

    J'espère que ça pourra aider qqn. Quand j'aurais fini mon "projet" je mettrais comment j'ai récup les informations lat/long. Mais pour ça faut que l'autre partie de mon projet soit fini et cela ne dépend pas de moi

    Code actuel

    Classe Map
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    99
    100
    101
    102
    103
    104
    105
    import java.util.List;
     
    import com.google.android.maps.*;
     
    import android.graphics.drawable.Drawable;
    import android.location.Location;
    import android.os.Bundle;
    import android.view.Menu;
    import android.view.MenuItem;
    import android.view.Window;
     
    public class LocActivity extends MapActivity {
     
      // Attribut pour l'affichage de la carte
      private MapView            mapView;        // Vue qui affiche la carte
      private MapController      mapController;  // Controlleur pour la carte
      private GeoPoint           point;          // Point a afficher sur la carte
     
      // Attribut pour afficher/utiliser le marqueur
      private List<Overlay>      mapOverlays;    // Couche sur la carte
      private MapItemizedOverlay itemizedOverlay; // Affiche le dessin
      private OverlayItem        overlayItem;    // Dessin sur la couche
      private GeoPoint           newPoint;       // Nouvelle position Lat/Long
      private Drawable           drawable;       // Dessin
     
      // Attribut pour vérifier s il y a un marqueur sur la carte
      private boolean            id = false;     // true:MarqueurSurCarte
                                                  // false:PasDeMarqueur
     
      // Attribut pour récupérer les information de la position marquee
      private Location           location;       // Recuperation position du
                                                  // marqueur
     
      public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        requestWindowFeature(Window.FEATURE_NO_TITLE);
        setContentView(R.layout.main);
     
        mapView = (MapView) findViewById(R.id.map_view);
        mapView.setBuiltInZoomControls(true);
     
        mapView.setClickable(true);
        mapController = mapView.getController();
        double lat = 46.806219D;
        double lon = 7.1662690D;
        point = new GeoPoint((int) (lat * 1E6), (int) (lon * 1E6));
        mapController.animateTo(point);
        mapController.setZoom(17);
     
        mapView.setSatellite(true);
        mapView.invalidate();
     
        this.init();
      }
     
      @Override
      protected boolean isRouteDisplayed() {
        return false;
      }
     
      // Initisalisation de la couche et du marqueur
      private void init() {
        drawable = this.getResources().getDrawable(R.drawable.pbleu); // Icone
        mapOverlays = mapView.getOverlays(); // Ajoute une couche à la vue
        itemizedOverlay = new MapItemizedOverlay(drawable, this); // Créer un
                                                                  // nouveau dessin
      }
     
      /** Creation du menu */
      @Override
      public boolean onCreateOptionsMenu(Menu menu) {
        menu.add(0, 1000, 0, "Poser Marqueur").setIcon(
            android.R.drawable.ic_menu_manage);
        menu.add(0, 1001, 0, "Supprimer Marqueur").setIcon(
            android.R.drawable.ic_menu_view);
        return super.onCreateOptionsMenu(menu);
      }
     
      /** Handler sur le menu */
      public boolean onOptionsItemSelected(MenuItem item) {
        switch (item.getItemId()) {
          case 1000:
            mapOverlays.add(itemizedOverlay);
            newPoint = mapView.getMapCenter();
            overlayItem = new OverlayItem(newPoint, "Position", "Lat: "
                + newPoint.getLatitudeE6() + " Long: " + newPoint.getLongitudeE6());
     
            if (id == true) {
              itemizedOverlay.supOverlay();
              itemizedOverlay.addOverlay(overlayItem);
            } else if (id == false) {
              itemizedOverlay.addOverlay(overlayItem);
              id = true;
            }
     
            // location.setLatitude(newPoint.getLatitudeE6());
            // location.setLongitude(newPoint.getLongitudeE6());
            break;
          case 1001:
            itemizedOverlay.supOverlay();
            break;
        }
        return super.onOptionsItemSelected(item);
      }
    }
    Classe Overlay
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    import java.util.ArrayList;
     
    import android.app.AlertDialog;
    import android.content.Context;
    import android.graphics.drawable.Drawable;
     
    import com.google.android.maps.OverlayItem;
     
    public class MapItemizedOverlay extends com.google.android.maps.ItemizedOverlay {
      // Liste des marqueurs
      private ArrayList<OverlayItem> mOverlays = new ArrayList<OverlayItem>();
      private Context                mContext;
      private AlertDialog.Builder    dialog;
     
      public MapItemizedOverlay(Drawable defaultMarker) {
        super(boundCenterBottom(defaultMarker));
      }
     
      public MapItemizedOverlay(Drawable defaultMarker, Context context) {
        super(boundCenterBottom(defaultMarker));
        mContext = context;
        dialog = new AlertDialog.Builder(mContext);
      }
     
      @Override
      protected OverlayItem createItem(int i) {
        return mOverlays.get(i);
      }
     
      @Override
      public int size() {
        return mOverlays.size();
      }
     
      @Override
      // Affiche une fenêtre avec les renseignements de la position
      protected boolean onTap(int index) {
        OverlayItem item = mOverlays.get(index);
        dialog.setTitle(item.getTitle());
        dialog.setMessage(item.getSnippet());
        dialog.show();
     
        // Affichage simple (fonctionnel)
        // Toast.makeText(mContext, item.getSnippet(), Toast.LENGTH_SHORT).show();
        return true;
      }
     
     
      // Ajoute un marqueur à la couche
      public void addOverlay(OverlayItem overlay) {
        mOverlays.add(overlay);
        populate();
      }
     
      // Efface le marqueur de la couche utilisee
      public void supOverlay() {
        mOverlays.clear();
      }
     
    }

  2. #2
    Membre actif
    Profil pro
    Inscrit en
    Septembre 2007
    Messages
    334
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2007
    Messages : 334
    Points : 218
    Points
    218
    Par défaut
    Citation Envoyé par PaloPalo Voir le message
    Bonjour,

    Via des tutoriels dans des livres sur Android, j'ai réussis à intégrer une map Google et la lancer sur mon HTC. Je peux me déplacer et zoomer sans aucun soucis.

    Pour la suite j'aimerais pouvoir zoomer sur un point (un bâtiment par exemple) et si je laisse le doigt longtemps sur cet endroit (long clic), il me récupère la latitude et la longitude de ce point afin que je puisse la réutiliser dans mon appli.

    J'ai un peu de peine à trouver des informations à ce sujet. Celà me permetterais de faire des comparaison avec le positionnement "Network/GPS" et la position réel stocké sur la map.

    J'espère que quelqu'un va pouvoir me renseigner.

    Palopalo
    Je ne vais pas pouvoir te renseigner directement, néanmoins, je pense que la MapView ne fait que se servir de l'API Google Map et on doit sans doute pouvoir récupérer les infos de lon/lat depuis celle-ci...

  3. #3
    Membre actif
    Profil pro
    Inscrit en
    Septembre 2007
    Messages
    334
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2007
    Messages : 334
    Points : 218
    Points
    218
    Par défaut
    Pour gérer les clics de souris, il faut utiliser un "Overlay" en redéfinissant sa méthode "onTap". (créer une nouvelle class étendant Overlay)

    Pour l'ajouter à la carte, il faut récupérer la liste des Overlays et ajouter le sien.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    List<Overlay> overlays = mapView.getOverleys();
    MyOverlay myOver = new MyOverlay();
    overlays.add(MyOver);
    mapView.postInvalidate(); // met à jour l'affichage
    Pour convertir les coordonnées du point écran en coordonnées géographiques, il faut utiliser la class Projection.

    source livre : Développement d'applications professionnelles avec Android 2

  4. #4
    Nouveau membre du Club
    Inscrit en
    Novembre 2010
    Messages
    40
    Détails du profil
    Informations forums :
    Inscription : Novembre 2010
    Messages : 40
    Points : 28
    Points
    28
    Par défaut
    Salut, merci pour ce renseignement.

    De mon côté j'ai fait des test avec ma classe MapItemizedOverlay qui étend com.google.android.maps.ItemizedOverlay en utilisant ce tuto : http://developer.android.com/resourc...o-mapview.html

    classe Overlay
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    import java.util.ArrayList;
     
    import android.app.AlertDialog;
    import android.content.Context;
    import android.graphics.Canvas;
    import android.graphics.drawable.Drawable;
     
    import com.google.android.maps.MapView;
    import com.google.android.maps.OverlayItem;
     
    public class MapItemizedOverlay extends com.google.android.maps.ItemizedOverlay {
      // Liste des marqueurs
      private ArrayList<OverlayItem> mOverlays = new ArrayList<OverlayItem>();
      private Context                mContext;
     
      public MapItemizedOverlay(Drawable defaultMarker) {
        super(boundCenterBottom(defaultMarker));
      }
     
      public MapItemizedOverlay(Drawable defaultMarker, Context context) {
        super(boundCenterBottom(defaultMarker));
        mContext = context;
      }
     
      @Override
      protected OverlayItem createItem(int i) {
        return (OverlayItem) mOverlays.get(i);
      }
     
      @Override
      public int size() {
        return mOverlays.size();
      }
     
      @Override
      protected boolean onTap(int index) {
        OverlayItem item = mOverlays.get(index);
        AlertDialog.Builder dialog = new AlertDialog.Builder(mContext);
        dialog.setTitle(item.getTitle());
        dialog.setMessage(item.getSnippet());
        dialog.show();
        return true;
      }
     
      public void addOverlay(OverlayItem overlay) {
        mOverlays.add(overlay);
        populate();
      }
    }
    classe Map
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    import java.util.List;
     
    import com.google.android.maps.*;
     
    import android.graphics.drawable.Drawable;
    import android.location.Location;
    import android.os.Bundle;
    import android.view.Menu;
    import android.view.MenuItem;
    import android.view.Window;
     
    public class LocActivity extends MapActivity {
     
      private MapView            mapView;        // Vue qui affiche la carte
      private MapController      mapController;  // Controller pour la carte
      private GeoPoint           point;          // Point à afficher sur la carte
     
      private List<Overlay>      mapOverlays;    //
      private MapItemizedOverlay itemizedoverlay; //
     
      private Location           location;       // Attribut qui récupère la
                                                  // position pointée
     
      public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        requestWindowFeature(Window.FEATURE_NO_TITLE);
        setContentView(R.layout.main);
     
        mapView = (MapView) findViewById(R.id.map_view);
        mapView.setBuiltInZoomControls(true);
     
        mapView.setClickable(true);
        mapController = mapView.getController();
        double lat = 46.806219D;
        double lon = 7.1662690D;
        point = new GeoPoint((int) (lat * 1E6), (int) (lon * 1E6));
        mapController.animateTo(point);
        mapController.setZoom(17);
     
        mapView.setSatellite(true);
        mapView.invalidate();
      }
     
      @Override
      protected boolean isRouteDisplayed() {
        return false;
      }
     
      /** Creation du menu */
      @Override
      public boolean onCreateOptionsMenu(Menu menu) {
        menu.add(0, 1000, 0, "Poser Marqueur").setIcon(
            android.R.drawable.ic_menu_manage);
        menu.add(0, 1001, 0, "Supprimer Marqueur").setIcon(
            android.R.drawable.ic_menu_view);
        return super.onCreateOptionsMenu(menu);
      }
     
      /** Handler sur le menu */
      public boolean onOptionsItemSelected(MenuItem item) {
        switch (item.getItemId()) {
          case 1000:
            GeoPoint newPoint = mapView.getMapCenter();
     
            mapOverlays = mapView.getOverlays();
            Drawable drawable = this.getResources().getDrawable(R.drawable.pbleu);
            itemizedoverlay = new MapItemizedOverlay(drawable);
            OverlayItem overlayitem = new OverlayItem(newPoint, "Hello",
                "JeSuisUnTest");
     
            location.setLatitude(newPoint.getLatitudeE6());
            location.setLongitude(newPoint.getLongitudeE6());
     
            itemizedoverlay.addOverlay(overlayitem);
            mapOverlays.add(itemizedoverlay);
            break;
          case 1001:
            break;
        }
        return super.onOptionsItemSelected(item);
     
      }
    }
    Dans cette 2ème partie, j'ai créé un menu avec 2 boutons (notez que le 2ème est juste décoratif ). Quand je clique sur ce bouton je place un marqueur au centre de la map et en même temps stock les données du centre de la map dans une variable "location" grâce à

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    location.setLatitude(newPoint.getLatitudeE6());
    location.setLongitude(newPoint.getLongitudeE6());
    Je vais faire la suite des test cet aprèm pour récupérer ma location dans mon activité qui lance ma carte Google.


    Par contre d'autre problèmes.
    - J'aimerais effacer le marqueur déjà posé quand j'en pose un nouveau. Mais la je bloque sur la manière d'y arriver
    - Si je clique sur le marqueur, il devrait m'afficher "Hello, JeSuisUnTest", mais au lieu de ça il ferme le programme avec un message d'erreur.

    J'ai lu et relu la partie du tutoriel à ce sujet (link plus haut), mais impossible de trouver l'erreur. Si vous avez une info pour ceci.

  5. #5
    Membre actif
    Profil pro
    Inscrit en
    Septembre 2007
    Messages
    334
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2007
    Messages : 334
    Points : 218
    Points
    218
    Par défaut
    Déjà pour le marqueur, au lieu d'en créer un nouveau à chaque foi, tu peux sans doute réutiliser le même à chaque foi, en gardant l'instance.
    Sinon, je suis sur que MapItemizedOverlay propose une méthode pour supprimer un item, là encore il faudra l'instance en paramètre.
    Oula, je viens de voir que tu ajoutes un Overlay à chaque fois ! Il faut en créer un seul et travailler avec lui, un Overlay est une couche de carte en fait.

    Pour l'erreur, je ne saurai trop te conseiller d'afficher la console Android qui va te donner de parfois curieuses, mais néanmoins précieuses informations.
    La console ADB, il existe des tutos pour savoir comment l'afficher.

    Par ailleurs, si je peux me permettre, il vaut mieux prendre le temps de bien comprendre que de créer sans vraiment savoir ce que l'on fait !

  6. #6
    Nouveau membre du Club
    Inscrit en
    Novembre 2010
    Messages
    40
    Détails du profil
    Informations forums :
    Inscription : Novembre 2010
    Messages : 40
    Points : 28
    Points
    28
    Par défaut
    Oula, je viens de voir que tu ajoutes un Overlay à chaque fois ! Il faut en créer un seul et travailler avec lui, un Overlay est une couche de carte en fait.
    Je ne suis pas sûr de bien saisir de quel ligne il s'agit. C'est vrai que actuellement une partie de ce que je fais n'est pas totalement compris. C'est aussi pour ça que malgré avoir suivit certains tuto je ne trouve pas les fautes que j'ai fait.


    Pour l'erreur, je ne saurai trop te conseiller d'afficher la console Android qui va te donner de parfois curieuses, mais néanmoins précieuses informations.
    La console ADB, il existe des tutos pour savoir comment l'afficher.
    Pour la fenêtre debug spécial c'est bon. Windows --> Open Perspective --> Others --> DDMS Perspective.
    J'ai plus qu'à trouver pourquoi rien ne s'affiche...

  7. #7
    Membre actif
    Profil pro
    Inscrit en
    Septembre 2007
    Messages
    334
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2007
    Messages : 334
    Points : 218
    Points
    218
    Par défaut
    Citation Envoyé par PaloPalo Voir le message
    Je ne suis pas sûr de bien saisir de quel ligne il s'agit. C'est vrai que actuellement une partie de ce que je fais n'est pas totalement compris. C'est aussi pour ça que malgré avoir suivit certains tuto je ne trouve pas les fautes que j'ai fait.
    Il faut créer l'Overlay avant l'écouteur sur le menu :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    MapItemizedOverlay  itemizedoverlay = new MapItemizedOverlay(drawable);
    Il faut faire cela aussi pour le drawable :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    Drawable drawable = this.getResources().getDrawable(R.drawable.pbleu);
    Et pour tout autre objet d'ailleurs, car sinon, à chaque appui sur le bouton, un nouvel objet est créé.

    Il faut aussi ajouter l'Overlay avant :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    mapOverlays.add(itemizedoverlay);
    Et ne plus l'ajouter ensuite, il faut travailler sur l'instance "itemizedoverlay", sans en créer de nouvelles.

    Même si un objet doit être créé de nouveau, il vaut mieux utiliser la même variable à chaque fois, pour soulager la gestion de la mémoire.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    private Objet unObjet;
        public boolean onOptionsItemSelected(MenuItem item) {
            unObjet = new Objet();
        }
    Sans entrer dans les détails, il faut une chose dans ce genre :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
     
        private MapView mapView;
        private Drawable drawable;
        private OverlayItem overlayitem;
        private GeoPoint newPoint;
        private List<Overlay> mapOverlays;
        private MapItemizedOverlay itemizedoverlay;
     
        // prépare
        private void init() {
            drawable = this.getResources().getDrawable(R.drawable.pbleu);
            mapOverlays = mapView.getOverlays();
            itemizedoverlay = new MapItemizedOverlay(drawable);
            mapOverlays.add(itemizedoverlay);
        }
     
        /** Handler sur le menu */
        public boolean onOptionsItemSelected(MenuItem item) {
            switch (item.getItemId()) {
                case 1000:
                    newPoint = mapView.getMapCenter();
                    overlayitem = new OverlayItem(newPoint, "Hello", "JeSuisUnTest");
                    itemizedoverlay.addOverlay(overlayitem);
                    location.setLatitude(newPoint.getLatitudeE6());
                    location.setLongitude(newPoint.getLongitudeE6());
                    break;
                case 1001:
                    break;
            }
            return super.onOptionsItemSelected(item);
     
        }
    Après, il faut ne pas faire un addOverlay à chaque fois, mais trouver un moyen de le remplacer, peut etre uniquement changer overlayitem par un nouvel objet puis mettre à jour la mapView. Après, je ne sais pas comment fonctionne l'API exactement.

    Bonne continuation.

  8. #8
    Membre actif
    Profil pro
    Inscrit en
    Septembre 2007
    Messages
    334
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2007
    Messages : 334
    Points : 218
    Points
    218
    Par défaut
    Citation Envoyé par PaloPalo Voir le message
    Pour la fenêtre debug spécial c'est bon. Windows --> Open Perspective --> Others --> DDMS Perspective.
    J'ai plus qu'à trouver pourquoi rien ne s'affiche...
    Est-ce que le téléphone est bien en mode "debug usb" ? À régler dans les paramètres du téléphone.

  9. #9
    Nouveau membre du Club
    Inscrit en
    Novembre 2010
    Messages
    40
    Détails du profil
    Informations forums :
    Inscription : Novembre 2010
    Messages : 40
    Points : 28
    Points
    28
    Par défaut
    J'ai réglé le soucis pour la fenêtre debug. En affichant des Sysout j'ai pu définir que le problème sur le onTap() venez de l'alertDialog. Je vais voir ce que je peux faire.

    EDIT :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
      @Override
      protected boolean onTap(int index) {
        System.out.println("onTap : Entree OK");
        OverlayItem item = mOverlays.get(index);
        System.out.println("onTap : Recup Overlays OK");
        AlertDialog.Builder dialog = new AlertDialog.Builder(mContext);
        System.out.println("onTap : Alert OK");
        dialog.setTitle(item.getTitle());
        System.out.println("onTap : Titre OK");
        dialog.setMessage(item.getSnippet());
        System.out.println("onTap : Message OK");
        dialog.show();
        System.out.println("onTap : Show OK");
        return true;
      }
    La partie en gras pose problème. Recherche en cours ...

    ------------------------------------------------------------------
    Merci beaucoup, ce que tu m'as donné au dessus fonctionne. J'arrive toujours afficher mon petit icône. J'avais pourtant fait une méthode similaire, mais j'avais pas mis une des lignes ce qui me valait une fermeture du programme.
    Donc si je comprend bien avec ce que tu m'as donné, il n'utilise qu'un objet ? Je vais chercher maintenant comment remplacer l'overlay plutôt que de le refaire. ou alors le supprimer avant de faire un nouveau

  10. #10
    Membre actif
    Profil pro
    Inscrit en
    Septembre 2007
    Messages
    334
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2007
    Messages : 334
    Points : 218
    Points
    218
    Par défaut
    Tu devrais lire des cours sur la programmation java en général, pour comprendre les concepts, car là par exemple, ce serait mieux de créer la dialog une seul et unique fois et ensuite de s'en servir.

    Car sinon, un objet est créé à chaque fois, pour rien et sous Android c'est important de l'éviter sinon ça rame !

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
    AlertDialog.Builder dialog = new AlertDialog.Builder(context);
    // ensuite dans la méthode
    private void dansLaMethode(){
        dialog.setTitle("titre");
        dialog.setMessage("message");
        dialog.show();
    }
    Ensuite en testant ton code j'obtiens cette erreur :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    // java.lang.RuntimeException: Can't create handler inside thread that has not called Looper.prepare()
    Si tu cherches uniquement à afficher le résultat, le plus simple est encore ça :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    // le context est l'Activity, 'this' si tu est dans l'Activity
    Toast.makeText(context, message, Toast.LENGTH_SHORT).show();
    Car la Dialog est plus particulière.

  11. #11
    Nouveau membre du Club
    Inscrit en
    Novembre 2010
    Messages
    40
    Détails du profil
    Informations forums :
    Inscription : Novembre 2010
    Messages : 40
    Points : 28
    Points
    28
    Par défaut
    C'est vrai que je pense rarement à mettre mes attributs hors de la méthode.

    Je vais tester quelque chose comme
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
      @Override
      protected boolean onTap(int index) {
        System.out.println("onTap : Entree OK");
     
        OverlayItem item = mOverlays.get(index);
        System.out.println("onTap : Overlay OK");
     
        Toast.makeText(mContext, item.getSnippet(), Toast.LENGTH_SHORT).show();
        System.out.println("onTap : Show OK");
        return true;
      }
    Mais avant faut que je règle un autre soucis. Depuis que j'ai fait la méthode init() en suivant tes conseils, je n'arrive plus déplacer ma map sans générer une fermeture du programme. Toujours un nouveau problème quand un autre disparait .

  12. #12
    Membre actif
    Profil pro
    Inscrit en
    Septembre 2007
    Messages
    334
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2007
    Messages : 334
    Points : 218
    Points
    218
    Par défaut
    Citation Envoyé par PaloPalo Voir le message
    Mais avant faut que je règle un autre soucis. Depuis que j'ai fait la méthode init() en suivant tes conseils, je n'arrive plus déplacer ma map sans générer une fermeture du programme. Toujours un nouveau problème quand un autre disparait .
    Ah la la, je croie que je vais te laisser galérer un peu, c'est le meilleur moyen d'apprendre.
    La route est longue et semée d'embuches...

  13. #13
    Nouveau membre du Club
    Inscrit en
    Novembre 2010
    Messages
    40
    Détails du profil
    Informations forums :
    Inscription : Novembre 2010
    Messages : 40
    Points : 28
    Points
    28
    Par défaut
    Il faut surtout que je gère une erreur à la fois.

    J'ai donc décidé de reprendre à l'endroit ou j'avais tout sous mon bouton (la je peux créer le marquer et déplacer ma map sans aucun soucis) et je vais faire comme ça

    - Gérer la suppression d'un marqueur lors de la création du nouveau
    - Gérer l'affichage des info sur le marqueurs
    - Optimisé la création du marqueur via un init()

    Parce que là à vouloir tout gérer en même temps je sais plus ce que je modifie . Merci en tout cas pour les infos, je continuerais de toute façon à compléter ce post au fur et à mesure que j'avance


    Suppression Marqueur

    Alors du côté de ma classe Overlay, j'ai deux méthodes, la 1ère qui créé un nouvel Overlay (version avec ID existante) et une méthode qui clear l'overlay (version avec reset de l'ID existante).

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
      public void addOverlay(OverlayItem overlay) {
        mOverlays.add(overlay);
        populate();
      }
     
      public void supOverlay() { 
        mOverlays.clear();
      }
    Voici maintenant une version simple du code des boutons

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
        switch (item.getItemId()) {
          case 1000:
            drawable = this.getResources().getDrawable(R.drawable.pbleu);
            mapOverlays = mapView.getOverlays();
            itemizedOverlay = new MapItemizedOverlay(drawable);
            mapOverlays.add(itemizedOverlay);
     
            newPoint = mapView.getMapCenter();
            overlayItem = new OverlayItem(newPoint, "Hello", "JeSuisUnTest");
     
            itemizedOverlay.addOverlay(overlayItem);
     
            break;
          case 1001:
            itemizedOverlay.supOverlay();
            break;
    Si je clique sur le Bouton "1000", un marqueur apparait sur ma carte, si je clique sur le Bouton "1001" droit derrière, le marqueur disparait. Et si je fait plusieurs marqueur de suite avec le bouton "1000" et que après j'utilise le bouton "1001" plusieurs fois pour effacer, il n'y a que le dernier Overlay qui est clear.

    Pour ne pas devoir utiliser le 2ème bouton et que le 1er marqueur disparaisse quand le deux apparait, je me suis dit que si je faisait la manip à la suite ça devrait fonctionner.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
          case 1000:
            drawable = this.getResources().getDrawable(R.drawable.pbleu);
            mapOverlays = mapView.getOverlays();
            itemizedOverlay = new MapItemizedOverlay(drawable);
            mapOverlays.add(itemizedOverlay);
     
            newPoint = mapView.getMapCenter();
            overlayItem = new OverlayItem(newPoint, "Hello", "JeSuisUnTest");
     
            // id init à 0;
            if (id == 1){
              itemizedOverlay.supOverlay();
              itemizedOverlay.addOverlay(overlayItem);
            } else if (id == 0) {
              itemizedOverlay.addOverlay(overlayItem);
              id=1;
            }
            break;
    Donc la 1ère fois que je clique sur mon bouton j'ajoute un marqueur. La 2ème fois que je clique sur le bouton, le marqueur devrais s'effacer comme si j'utilisais l'autre bouton, puis en recréer un autre directement, mais il continu d'en créer sans effacé celui d'avant.

    ça doit être ma compréhension qui doit foirer. J'ai fait la même chose avec des index, vu qu'il est possible de "add()" un overlay avec un index et de "remove()" l'index par la suite. Mais même problème

  14. #14
    Nouveau membre du Club
    Inscrit en
    Novembre 2010
    Messages
    40
    Détails du profil
    Informations forums :
    Inscription : Novembre 2010
    Messages : 40
    Points : 28
    Points
    28
    Par défaut
    Solution AlertDialog

    Version avec un affichage simple (rien à mettre dans le constructeur et aucun attribut à déclarer)

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
      @Override
      protected boolean onTap(int index) {
        OverlayItem item = mOverlays.get(index);
        Toast.makeText(mContext, item.getSnippet(), Toast.LENGTH_SHORT).show();
        return true;
      }

    Version avec l'AlertDialog (ajout d'un attribut, récupérer le contexte via le constructeur)

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
      private AlertDialog.Builder    dialog;
     
      public MapItemizedOverlay(Drawable defaultMarker, Context context) {
        super(boundCenterBottom(defaultMarker));
        mContext = context;
        dialog = new AlertDialog.Builder(mContext);
      }
     
      @Override
      protected boolean onTap(int index) {
        OverlayItem item = mOverlays.get(index);
        dialog.setTitle(item.getTitle());
        dialog.setMessage(item.getSnippet());
        dialog.show();
        return true;
      }
    Mon problème venez de deux endroit, je créais l'AlertDialog directement dans le onTap() qui n'est pas optimisé, mais surtout dans ma classe map, je n'appelais pas le constructeur qui utilisé le context donc grosse erreur du programme.

  15. #15
    Nouveau membre du Club
    Inscrit en
    Novembre 2010
    Messages
    40
    Détails du profil
    Informations forums :
    Inscription : Novembre 2010
    Messages : 40
    Points : 28
    Points
    28
    Par défaut
    Solution Effacer Marqueur lorsque déjà existant

    Comme chaque point est une nouvelle couche et qu'il n'est capable de clear que la couche actuellement utilisé, j'ai repris ma méthode init() qui se trouve dans mon onCreate().

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
      // Initisalisation de la couche et du marqueur
      private void init() {
        drawable = this.getResources().getDrawable(R.drawable.pbleu);
        mapOverlays = mapView.getOverlays();
        itemizedOverlay = new MapItemizedOverlay(drawable, this); 
      }

    Il faut bien laisser la ligne "mapOverlays.add(itemizedOverlay)" ici car si on la met dans le init() pas possible de bouger la map sans erreur avant d'avoir poser un point.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
      private boolean            id    = false;  // true:MarqueurSurCarte
                                                  // false:PasDeMarqueur
     
        switch (item.getItemId()) {
          case 1000:
            mapOverlays.add(itemizedOverlay);
            newPoint = mapView.getMapCenter();
            overlayItem = new OverlayItem(newPoint, "Position", "Lat: "
                + newPoint.getLatitudeE6() + " Long: " + newPoint.getLongitudeE6());
     
            if (id == true) {
              itemizedOverlay.supOverlay();
              itemizedOverlay.addOverlay(overlayItem);
            } else if (id == false) {
              itemizedOverlay.addOverlay(overlayItem);
              id = true;
            }
            break;
            }
    Merci beaucoup dawadam

    Maintenant me reste à faire ce pour quoi j'ai poster à la base. J'ai toutes les info me reste plus qu'a réussir à les récupérer dans l'activité qui lance la map.

  16. #16
    Membre actif
    Profil pro
    Inscrit en
    Septembre 2007
    Messages
    334
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2007
    Messages : 334
    Points : 218
    Points
    218
    Par défaut
    Citation Envoyé par PaloPalo Voir le message
    Merci beaucoup dawadam
    De rien jeune Padawan

  17. #17
    Nouveau membre du Club
    Inscrit en
    Novembre 2010
    Messages
    40
    Détails du profil
    Informations forums :
    Inscription : Novembre 2010
    Messages : 40
    Points : 28
    Points
    28
    Par défaut
    Bon je comprend pas je ne peux pas éditer mes ancien message je verrais après

    Voilà j'ai enfin trouvé ce qu'il me fallait pour envoyé ma position de l'activité map à mon activité principale (qui fait de la géolocalisation GPS/Network).


    Du côté de la subactivity j'ai créé une groupe d'information (Bundle) que je renvoie à l'activité principale via un putDouble (pour attribuer les doubles au Bundle) et un putExtras pour envoyé les info à notre Intent.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
      public boolean onOptionsItemSelected(MenuItem item) {
        switch (item.getItemId()) {
          case 1000:
            mapOverlays.add(itemizedOverlay);
            newPoint = mapView.getMapCenter();
     
            latMap = this.getLatitude(newPoint);
            longMap = this.getLongitude(newPoint);
     
            overlayItem = new OverlayItem(newPoint, "Position", "Lat: " + latMap
                + " Long: " + longMap);
     
            if (isMarked == true) {
              itemizedOverlay.supOverlay();
              itemizedOverlay.addOverlay(overlayItem);
            } else if (isMarked == false) {
              itemizedOverlay.addOverlay(overlayItem);
              isMarked = true;
            }
     
            Bundle position = new Bundle();
            position.putDouble("latitude", latMap);
            position.putDouble("longitude", longMap);
            Intent myIntent = new Intent();
            myIntent.putExtras(position);
            this.setResult(RESULT_OK, myIntent);
            break;
          case 1001:
            itemizedOverlay.supOverlay();
            break;
        }
        return super.onOptionsItemSelected(item);
      }
    du côté de ma classe principale, Je lance l'activité quand on appuie sur le bouton

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
          case R.id.butDisMap:
            Intent intent = new Intent(this, LocWirelessMapActivity.class);
            this.startActivityForResult(intent, ACTIVITY_RESULT_POS);
            break;
    Et je récupère l'information revenant de ma sous-activité via cette méthode.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
      @Override
      protected void onActivityResult(int requestCode, int resultCode, Intent intent) {
        super.onActivityResult(requestCode, resultCode, intent);
     
        Bundle extras = intent.getExtras();
     
        if (requestCode == ACTIVITY_RESULT_POS) {
          if (resultCode == RESULT_OK) {
            latMap = extras.getDouble("latitude");
            longMap = extras.getDouble("longitude");
            locationM = new Location("");
            locationM.setLatitude(latMap);
            locationM.setLongitude(longMap);
            validationPossible();
          }
        }
      }
    Par contre j'aimerais bien mettre le code complet de ma dernière classe et les corrections des deux autres dans le poste principale mais j'ai pas le bouton éditer

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. [Google Maps] Récupérer lat et long dans PHP
    Par karync dans le forum APIs Google
    Réponses: 2
    Dernier message: 28/09/2011, 11h18
  2. [MySQL] récupérer plusieurs tuples depuis un array
    Par psychoBob dans le forum PHP & Base de données
    Réponses: 4
    Dernier message: 29/12/2005, 19h17
  3. Conversion Lat/Long vers UTM
    Par efficks dans le forum Algorithmes et structures de données
    Réponses: 6
    Dernier message: 12/12/2005, 18h13
  4. Récupérer le MCD depuis la base
    Par cladsam dans le forum Langage SQL
    Réponses: 2
    Dernier message: 06/11/2005, 17h01
  5. [Eclipse] [VSS plugin] Récupérer un projet depuis le server?
    Par Bobsinglar dans le forum Eclipse Java
    Réponses: 1
    Dernier message: 23/05/2005, 18h12

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo