Google Maps API Android v2 - Interactive InfoWindow (comme dans Google maps android original))

j'essaie de faire personnalisé InfoWindow après un clic sur un marqueur avec la nouvelle API Google Maps v2. Je veux qu'il ressemble à L'application de cartes d'origine par Google. Comme ceci:

Example Image

quand j'ai ImageButton à l'intérieur, il ne fonctionne pas - l'ensemble InfoWindow est découpé et pas seulement le ImageButton . J'ai lu que c'est parce qu'il n'y a pas un View lui-même mais c'est un instantané, donc des éléments individuels on ne peut pas les distinguer les uns des autres.

EDIT: Dans la documentation (merci à Disco S2 ):

comme mentionné dans la section précédente sur les fenêtres d'information, une fenêtre d'information n'est pas une vue en direct, la vue est plutôt rendue comme une image sur le cartographie. En conséquence, tous les écouteurs que vous mettez sur la vue sont ignorés et vous ne pouvez pas distinguer cliquez sur événements sur les différentes parties de vue. Il est conseillé de ne pas placer de composants interactifs-tels que comme des boutons, des cases à cocher, ou des entrées de texte - dans vos informations personnalisées fenêtre.

mais si Google l'utilise, il doit y avoir un moyen de le faire. Quelqu'un aurait-il une idée?

178
demandé sur albert c braun 2013-01-02 17:47:42

7 réponses

je cherchais une solution à ce problème moi-même avec pas de chance, j'ai donc dû rouler pour moi et j'aimerais partager ici avec vous. (S'il vous plaît excuser mon mauvais anglais) (C'est un peu fou pour répondre à un autre tchèque gars en anglais :-) )

La première chose que j'ai essayé était d'utiliser un bon vieux PopupWindow . C'est assez facile - on n'a qu'à écouter le OnMarkerClickListener et ensuite afficher une coutume PopupWindow au-dessus du marqueur. D'autres gars sur StackOverflow suggéré cette solution et il semble en fait assez bon à première vue. Mais le problème avec cette solution s'affiche lorsque vous commencez à déplacer la carte autour. Vous devez déplacer le PopupWindow d'une façon ou d'une autre vous-même ce qui est possible (en écoutant certains événements onTouch) mais IMHO vous ne pouvez pas le faire paraître assez bon, surtout sur certains appareils lents. Si vous le faites de la manière simple, il "saute" autour d'un endroit à un autre. Vous pouvez également utiliser quelques animations pour polir ces sauts, mais de cette façon PopupWindow sera toujours "un pas en arrière" là où il devrait être sur la carte que je n'aime pas.

à ce moment-là, je pensais à une autre solution. Je me suis rendu compte que je n'ai pas vraiment besoin de beaucoup de liberté - pour montrer mes vues personnalisées avec toutes les possibilités qui viennent avec elle (comme les barres de progrès animés etc.). Je pense qu'il y a une bonne raison pour laquelle même les ingénieurs de google ne le font pas de cette façon dans L'application Google Maps. Tout ce que je besoin est un bouton ou deux sur la fenêtre InfoWindow qui affichera un état pressé et déclenchera quelques actions lorsque cliqué. J'ai donc trouvé une autre solution qui se divise en deux parties:

première partie:

La première partie est d'être en mesure d'intercepter les clics sur les boutons pour déclencher une action. Mon idée est la suivante:

  1. conserver une référence à l'infoWindow personnalisé créé dans le InfoWindowAdapter.
  2. envelopper le MapFragment (ou MapView ) à l'intérieur d'un groupe de vue personnalisé (mine est appelé MapWrapperLayout)
  3. remplace le dispatchTouchEvent de MapWrapperLayout et (si L'InfoWindow est actuellement affiché) achemine d'abord les événements de mouvement à L'InfoWindow précédemment créé. S'il ne consomme pas les événements de mouvement (comme parce que vous n'avez pas cliqué sur une zone cliquable à L'intérieur de InfoWindow etc.) puis (et seulement alors) laisser les événements descendre à la MapWrapperLayout superclass donc il sera éventuellement livré à la carte.

voici le code source de MapWrapperLayout:

package com.circlegate.tt.cg.an.lib.map;

import com.google.android.gms.maps.GoogleMap;
import com.google.android.gms.maps.model.Marker;

import android.content.Context;
import android.graphics.Point;
import android.util.AttributeSet;
import android.view.MotionEvent;
import android.view.View;
import android.widget.RelativeLayout;

public class MapWrapperLayout extends RelativeLayout {
    /**
     * Reference to a GoogleMap object 
     */
    private GoogleMap map;

    /**
     * Vertical offset in pixels between the bottom edge of our InfoWindow 
     * and the marker position (by default it's bottom edge too).
     * It's a good idea to use custom markers and also the InfoWindow frame, 
     * because we probably can't rely on the sizes of the default marker and frame. 
     */
    private int bottomOffsetPixels;

    /**
     * A currently selected marker 
     */
    private Marker marker;

    /**
     * Our custom view which is returned from either the InfoWindowAdapter.getInfoContents 
     * or InfoWindowAdapter.getInfoWindow
     */
    private View infoWindow;    

    public MapWrapperLayout(Context context) {
        super(context);
    }

    public MapWrapperLayout(Context context, AttributeSet attrs) {
        super(context, attrs);
    }

    public MapWrapperLayout(Context context, AttributeSet attrs, int defStyle) {
        super(context, attrs, defStyle);
    }

    /**
     * Must be called before we can route the touch events
     */
    public void init(GoogleMap map, int bottomOffsetPixels) {
        this.map = map;
        this.bottomOffsetPixels = bottomOffsetPixels;
    }

    /**
     * Best to be called from either the InfoWindowAdapter.getInfoContents 
     * or InfoWindowAdapter.getInfoWindow. 
     */
    public void setMarkerWithInfoWindow(Marker marker, View infoWindow) {
        this.marker = marker;
        this.infoWindow = infoWindow;
    }

    @Override
    public boolean dispatchTouchEvent(MotionEvent ev) {
        boolean ret = false;
        // Make sure that the infoWindow is shown and we have all the needed references
        if (marker != null && marker.isInfoWindowShown() && map != null && infoWindow != null) {
            // Get a marker position on the screen
            Point point = map.getProjection().toScreenLocation(marker.getPosition());

            // Make a copy of the MotionEvent and adjust it's location
            // so it is relative to the infoWindow left top corner
            MotionEvent copyEv = MotionEvent.obtain(ev);
            copyEv.offsetLocation(
                -point.x + (infoWindow.getWidth() / 2), 
                -point.y + infoWindow.getHeight() + bottomOffsetPixels);

            // Dispatch the adjusted MotionEvent to the infoWindow
            ret = infoWindow.dispatchTouchEvent(copyEv);
        }
        // If the infoWindow consumed the touch event, then just return true.
        // Otherwise pass this event to the super class and return it's result
        return ret || super.dispatchTouchEvent(ev);
    }
}

tout cela va rendre les vues à l'intérieur de L'InfoView" live " à nouveau - les OnClickListeners vont commencer à déclencher, etc.

deuxième partie: Le problème qui reste est, qu'évidemment, vous ne pouvez pas voir de modifications de L'interface utilisateur de votre InfoWindow à l'écran. Pour ce faire vous devez marqueur d'appel manuel.showInfoWindow. Maintenant, si vous effectuez un changement permanent dans votre InfoWindow (comme changer l'étiquette de votre bouton pour quelque chose d'autre), c'est suffisant.

mais montrer un bouton appuyé sur l'état ou quelque chose de cette nature est plus compliqué. Le premier problème est ,que (au moins) je n'ai pas été en mesure de faire le bouton InfoWindow montre l'état du bouton normal pressé. Même si j'ai appuyé sur le bouton pendant une longue période, Il est juste resté non appuyé sur l'écran. Je croyez que c'est quelque chose qui est géré par le cadre de la carte lui-même qui s'assure probablement de ne pas montrer n'importe quel état transitoire dans les fenêtres d'information. Mais je pourrais me tromper, je n'ai pas essayé de le découvrir.

ce que j'ai fait est un autre méchant hack - j'ai attaché un OnTouchListener au bouton et changé manuellement son arrière - plan lorsque le bouton a été pressé ou relâché à deux tirables personnalisés-un avec un bouton dans un état normal et l'autre dans un état pressé. Ce n'est pas très joli, mais il fonctionne :). Maintenant j'ai pu voir le bouton PASSER d'un état normal à un état pressé sur l'écran.

il y a encore un dernier bug - si vous cliquez trop vite sur le bouton, il ne montre pas l'état pressé - il reste juste dans son état normal (bien que le clic lui-même est allumé de sorte que le bouton"fonctionne"). Au moins, c'est comme ça que ça se voit sur mon Nexus galactique. Donc la dernière chose que j'ai faite c'est que j'ai retardé le bouton dans son état un peu pressé. C'est en outre assez laid et je ne suis pas sûr comment cela fonctionnerait sur certains vieux, appareils lents, mais je soupçonne que même le cadre de carte lui-même fait quelque chose comme cela. Vous pouvez l'essayer vous - même - lorsque vous cliquez sur L'ensemble InfoWindow, il reste dans un état pressé un peu plus longtemps, puis boutons normaux font (encore-au moins sur mon téléphone). Et c'est en fait comme ça que ça marche même sur L'application Google Maps originale.

quoi qu'il en soit, je me suis écrit une classe personnalisée qui gère les changements d'état de boutons et toutes les autres choses que j'ai mentionnées, donc voici le code:

package com.circlegate.tt.cg.an.lib.map;

import android.graphics.drawable.Drawable;
import android.os.Handler;
import android.view.MotionEvent;
import android.view.View;
import android.view.View.OnTouchListener;

import com.google.android.gms.maps.model.Marker;

public abstract class OnInfoWindowElemTouchListener implements OnTouchListener {
    private final View view;
    private final Drawable bgDrawableNormal;
    private final Drawable bgDrawablePressed;
    private final Handler handler = new Handler();

    private Marker marker;
    private boolean pressed = false;

    public OnInfoWindowElemTouchListener(View view, Drawable bgDrawableNormal, Drawable bgDrawablePressed) {
        this.view = view;
        this.bgDrawableNormal = bgDrawableNormal;
        this.bgDrawablePressed = bgDrawablePressed;
    }

    public void setMarker(Marker marker) {
        this.marker = marker;
    }

    @Override
    public boolean onTouch(View vv, MotionEvent event) {
        if (0 <= event.getX() && event.getX() <= view.getWidth() &&
            0 <= event.getY() && event.getY() <= view.getHeight())
        {
            switch (event.getActionMasked()) {
            case MotionEvent.ACTION_DOWN: startPress(); break;

            // We need to delay releasing of the view a little so it shows the pressed state on the screen
            case MotionEvent.ACTION_UP: handler.postDelayed(confirmClickRunnable, 150); break;

            case MotionEvent.ACTION_CANCEL: endPress(); break;
            default: break;
            }
        }
        else {
            // If the touch goes outside of the view's area
            // (like when moving finger out of the pressed button)
            // just release the press
            endPress();
        }
        return false;
    }

    private void startPress() {
        if (!pressed) {
            pressed = true;
            handler.removeCallbacks(confirmClickRunnable);
            view.setBackground(bgDrawablePressed);
            if (marker != null) 
                marker.showInfoWindow();
        }
    }

    private boolean endPress() {
        if (pressed) {
            this.pressed = false;
            handler.removeCallbacks(confirmClickRunnable);
            view.setBackground(bgDrawableNormal);
            if (marker != null) 
                marker.showInfoWindow();
            return true;
        }
        else
            return false;
    }

    private final Runnable confirmClickRunnable = new Runnable() {
        public void run() {
            if (endPress()) {
                onClickConfirmed(view, marker);
            }
        }
    };

    /**
     * This is called after a successful click 
     */
    protected abstract void onClickConfirmed(View v, Marker marker);
}

voici un fichier de mise en page InfoWindow personnalisé que j'ai utilisé:

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:gravity="center_vertical" >

    <LinearLayout
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:orientation="vertical"
        android:layout_marginRight="10dp" >

        <TextView
            android:id="@+id/title"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:textSize="18sp"
            android:text="Title" />

        <TextView
            android:id="@+id/snippet"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:text="snippet" />

    </LinearLayout>

    <Button
        android:id="@+id/button" 
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="Button" />

</LinearLayout>

Test de l'activité mise en page du fichier ( MapFragment être à l'intérieur de la MapWrapperLayout ):

<com.circlegate.tt.cg.an.lib.map.MapWrapperLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    android:id="@+id/map_relative_layout"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    tools:context=".MainActivity" >

    <fragment
        android:id="@+id/map"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        class="com.google.android.gms.maps.MapFragment" />

</com.circlegate.tt.cg.an.lib.map.MapWrapperLayout>

et enfin code source d'une activité d'essai, qui colle tout cela ensemble:

package com.circlegate.testapp;

import com.circlegate.tt.cg.an.lib.map.MapWrapperLayout;
import com.circlegate.tt.cg.an.lib.map.OnInfoWindowElemTouchListener;
import com.google.android.gms.maps.GoogleMap;
import com.google.android.gms.maps.GoogleMap.InfoWindowAdapter;
import com.google.android.gms.maps.MapFragment;
import com.google.android.gms.maps.model.LatLng;
import com.google.android.gms.maps.model.Marker;
import com.google.android.gms.maps.model.MarkerOptions;

import android.os.Bundle;
import android.app.Activity;
import android.content.Context;
import android.view.View;
import android.view.ViewGroup;
import android.widget.Button;
import android.widget.TextView;
import android.widget.Toast;

public class MainActivity extends Activity {    
    private ViewGroup infoWindow;
    private TextView infoTitle;
    private TextView infoSnippet;
    private Button infoButton;
    private OnInfoWindowElemTouchListener infoButtonListener;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        final MapFragment mapFragment = (MapFragment)getFragmentManager().findFragmentById(R.id.map);
        final MapWrapperLayout mapWrapperLayout = (MapWrapperLayout)findViewById(R.id.map_relative_layout);
        final GoogleMap map = mapFragment.getMap();

        // MapWrapperLayout initialization
        // 39 - default marker height
        // 20 - offset between the default InfoWindow bottom edge and it's content bottom edge 
        mapWrapperLayout.init(map, getPixelsFromDp(this, 39 + 20)); 

        // We want to reuse the info window for all the markers, 
        // so let's create only one class member instance
        this.infoWindow = (ViewGroup)getLayoutInflater().inflate(R.layout.info_window, null);
        this.infoTitle = (TextView)infoWindow.findViewById(R.id.title);
        this.infoSnippet = (TextView)infoWindow.findViewById(R.id.snippet);
        this.infoButton = (Button)infoWindow.findViewById(R.id.button);

        // Setting custom OnTouchListener which deals with the pressed state
        // so it shows up 
        this.infoButtonListener = new OnInfoWindowElemTouchListener(infoButton,
                getResources().getDrawable(R.drawable.btn_default_normal_holo_light),
                getResources().getDrawable(R.drawable.btn_default_pressed_holo_light)) 
        {
            @Override
            protected void onClickConfirmed(View v, Marker marker) {
                // Here we can perform some action triggered after clicking the button
                Toast.makeText(MainActivity.this, marker.getTitle() + "'s button clicked!", Toast.LENGTH_SHORT).show();
            }
        }; 
        this.infoButton.setOnTouchListener(infoButtonListener);


        map.setInfoWindowAdapter(new InfoWindowAdapter() {
            @Override
            public View getInfoWindow(Marker marker) {
                return null;
            }

            @Override
            public View getInfoContents(Marker marker) {
                // Setting up the infoWindow with current's marker info
                infoTitle.setText(marker.getTitle());
                infoSnippet.setText(marker.getSnippet());
                infoButtonListener.setMarker(marker);

                // We must call this to set the current marker and infoWindow references
                // to the MapWrapperLayout
                mapWrapperLayout.setMarkerWithInfoWindow(marker, infoWindow);
                return infoWindow;
            }
        });

        // Let's add a couple of markers
        map.addMarker(new MarkerOptions()
            .title("Prague")
            .snippet("Czech Republic")
            .position(new LatLng(50.08, 14.43)));

        map.addMarker(new MarkerOptions()
            .title("Paris")
            .snippet("France")
            .position(new LatLng(48.86,2.33)));

        map.addMarker(new MarkerOptions()
            .title("London")
            .snippet("United Kingdom")
            .position(new LatLng(51.51,-0.1)));
    }

    public static int getPixelsFromDp(Context context, float dp) {
        final float scale = context.getResources().getDisplayMetrics().density;
        return (int)(dp * scale + 0.5f);
    }
}

C'est ça. Jusqu'à présent, je n'ai testé cela que sur mon Nexus Galaxy. (4.2.1) et Nexus 7 (aussi 4.2.1), je vais l'essayer sur un téléphone en pain d'épice quand j'ai une chance. Une limitation que j'ai trouvé jusqu'à présent est que vous ne pouvez pas faire glisser la carte où est votre bouton sur l'écran et déplacer la carte. Ça pourrait probablement être surmonté, mais pour l'instant, je peux vivre avec ça.

je sais que c'est un horrible piratage mais je n'ai rien trouvé de mieux et j'ai tellement besoin de ce modèle de conception que ce serait vraiment une raison de revenir à la carte V1 framework (qui btw. Je voudrais vraiment éviter pour une nouvelle application avec des fragments etc.). Je ne comprends pas pourquoi Google ne propose pas aux développeurs un moyen officiel d'avoir un bouton sur InfoWindows. C'est un modèle de conception commune, en outre ce modèle est utilisé même dans L'application officielle de Google Maps :). Je comprends les raisons pour lesquelles ils ne peuvent pas simplement faire de vos vues "live" dans les InfoWindows - cela tuerait probablement la performance en se déplaçant et en faisant défiler la carte autour. Mais il devrait y avoir un moyen comment pour obtenir cet effet sans utiliser de vues.

316
répondu chose007 2017-11-29 11:42:36

je vois que cette question est déjà ancienne mais encore...

nous avons fait une bibliothèque sipmle à notre entreprise pour réaliser ce qui est désiré - une fenêtre d'information interactive avec des vues et tout. Vous pouvez le vérifier sur github .

j'espère que cela aide :)

11
répondu definera 2016-09-28 11:44:35

Voici mon point de vue sur le problème. Je crée AbsoluteLayout superposition qui contient la fenêtre D'information (une vue régulière avec chaque peu d'interactivité et les capacités de dessin). Puis je démarre Handler qui synchronise la position de la fenêtre d'information avec la position du point sur la carte tous les 16 ms. Ça a l'air dingue, mais ça marche.

Démo video: https://www.youtube.com/watch?v=bT9RpH4p9mU (tenir compte du fait que la performance est diminuée parce que de l'émulateur et de l'enregistrement vidéo fonctionnant simultanément).

Code de la démo: https://github.com/deville/info-window-demo

un article fournissant des détails (en russe): http://habrahabr.ru/post/213415 /

8
répondu Andrii Chernenko 2014-08-13 20:08:18

Pour ceux qui n'ont pas eu choose007's réponse et en cours d'exécution

si clickListener ne fonctionne pas correctement à tout moment dans la solution chose007's , essayez de mettre en œuvre View.onTouchListener au lieu de clickListener . Gérer l'événement tactile en utilisant l'une des actions ACTION_UP ou ACTION_DOWN . Pour une raison quelconque, les cartes infoWindow provoquent un comportement étrange lors de l'expédition à clickListeners .

infoWindow.findViewById(R.id.my_view).setOnTouchListener(new View.OnTouchListener() {
    @Override
    public boolean onTouch(View v, MotionEvent event) {
          int action = MotionEventCompat.getActionMasked(event);
          switch (action){
                case MotionEvent.ACTION_UP:
                    Log.d(TAG,"a view in info window clicked" );
                    break;
                }
                return true;
          }

Edit : C'est comme ça que je l'ai fait pas à pas

d'abord gonfler votre propre infowindow (variable globale) quelque part dans votre activité/fragment. Le mien est dans fragment. Assurez-vous également que la vue racine dans votre mise en page infowindow est linearlayout (pour quelque raison relativelayout prenait la pleine largeur de l'écran dans infowindow)

infoWindow = (ViewGroup) getActivity().getLayoutInflater().inflate(R.layout.info_window, null);
/* Other global variables used in below code*/
private HashMap<Marker,YourData> mMarkerYourDataHashMap = new HashMap<>();
private GoogleMap mMap;
private MapWrapperLayout mapWrapperLayout;

puis dans onMapReady callback de Google maps api android (suivez ceci si vous ne savez pas ce que onMapReady est "1519270920 les Cartes" > Documentation - mise en route )

   @Override
    public void onMapReady(GoogleMap googleMap) {
       /*mMap is global GoogleMap variable in activity/fragment*/
        mMap = googleMap;
       /*Some function to set map UI settings*/ 
        setYourMapSettings();

MapWrapperLayout initialisation de la /q/google-maps-android-api-v2-interactive-infowindow-comme-dans-original-android-google-maps-43002/"any_view cliqué" ); briser; } return true; } });

marqueur de poignée cliquer séparément

    @Override
    public boolean onMarkerClick(Marker marker) {
        Log.d(TAG,"on Marker Click called");
        marker.showInfoWindow();
        CameraPosition cameraPosition = new CameraPosition.Builder()
                .target(marker.getPosition())      // Sets the center of the map to Mountain View
                .zoom(10)
                .build();
        mMap.animateCamera(CameraUpdateFactory.newCameraPosition(cameraPosition),1000,null);
        return true;
    }
2
répondu Manish Jangid 2018-03-16 12:05:15

Juste une spéculation, je n'ai pas assez d'expérience pour essayer... )- :

étant donné que GoogleMap est un fragment, il devrait être possible de saisir l'événement marqueur onClick et afficher la vue personnalisée fragment . Un fragment de carte sera encore visible à l'arrière-plan. Quelqu'un at-il essayé? Aucune raison pourquoi il ne pouvait pas travailler?

l'inconvénient est que le fragment de carte serait gelé sur le fond, jusqu'à ce qu'un retour de fragment d'information personnalisé le contrôle.

0
répondu Wooff 2014-07-24 08:29:31

j'ai construit un échantillon de projet de studio android pour cette question.

sortie des captures d'écran :-

enter image description here

enter image description here

enter image description here

télécharger le code source complet du projet cliquez sur ici

s'il vous Plaît note: , vous devez ajouter votre clé API dans Androidmanifest.xml

-2
répondu Premkumar Manipillai 2016-09-30 11:57:25

c'est vraiment simple.

googleMap.setInfoWindowAdapter(new InfoWindowAdapter() {

            // Use default InfoWindow frame
            @Override
            public View getInfoWindow(Marker marker) {              
                return null;
            }           

            // Defines the contents of the InfoWindow
            @Override
            public View getInfoContents(Marker marker) {

                // Getting view from the layout file info_window_layout
                View v = getLayoutInflater().inflate(R.layout.info_window_layout, null);

                // Getting reference to the TextView to set title
                TextView note = (TextView) v.findViewById(R.id.note);

                note.setText(marker.getTitle() );

                // Returning the view containing InfoWindow contents
                return v;

            }

        });

il suffit d'ajouter le code ci-dessus dans votre classe où vous utilisez GoogleMap. R. layout.info_window_layout est notre mise en page personnalisée qui montre la vue qui remplacera infowindow. Je viens d'ajouter le textview ici. Vous pouvez ajouter à rajouter ici pour faire comme l'exemple de composant logiciel enfichable. Mon info_window_layout était

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"    
    android:layout_width="wrap_content"
    android:layout_height="wrap_content" 
    android:orientation="vertical" 
    >

        <TextView 
        android:id="@+id/note"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content" />

</LinearLayout>

j'espère que ça aidera. Nous pouvons trouver un exemple de travail de InfoWindow personnalisé à http://wptrafficanalyzer.in/blog/customizing-infowindow-contents-in-google-map-android-api-v2-using-infowindowadapter/#comment-39731

édité: ce code montre comment nous pouvons ajouter une vue personnalisée sur infoWindow. Ce code ne gérait pas les clics sur les éléments de vue personnalisés. Donc, il est proche de la réponse, mais pas exactement la réponse c'est pourquoi Il n'est pas accepté comme réponse.

-5
répondu Zeeshan Mirza 2013-04-29 06:06:50