web-dev-qa-db-fra.com

Fenêtre personnalisée Google map v2 avec deux boutons cliquables ou ImageView

enter image description here

J'ai besoin d'une fenêtre d'informations personnalisée avec deux boutons cliquables comme ci-dessus.Dans ce cas, plus de marqueur et cliquez sur l'un d'eux, la fenêtre doit être ouverte et lorsque vous cliquez sur un autre marqueur, une autre fenêtre doit ouvrir et fermer la fenêtre précédente ainsi en un seul clic. y a-t-il une raison spécifique pour laquelle google map v2 ne prend pas en charge les composants en direct comme le bouton, la case à cocher?

21
shivang Trivedi

Ce que vous essayez de réaliser est possible.

Vous pouvez voir la recette dans cette réponse: https://stackoverflow.com/a/15040761/2183804

Et une implémentation fonctionnelle sur Google Play .

9
MaciejGórski

MainActivity.Java

@TargetApi(Build.VERSION_CODES.HONEYCOMB)
public class MainActivity extends Activity {

  private ViewGroup infoWindow;
  private TextView infoTitle;
  private TextView infoSnippet;
  private Button infoButton1, infoButton2;
  private OnInfoWindowElemTouchListener infoButtonListener;

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

    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.init(map, getPixelsFromDp(this, 39 + 20));

    final Marker ki = map.addMarker(new MarkerOptions()
        .position(new LatLng(50.08, 14.43))
        .icon(BitmapDescriptorFactory
            .fromResource(R.drawable.circles)));

    infoWindow = (ViewGroup) getLayoutInflater()
        .inflate(R.layout.activity_main, null);
    infoButton1 = (Button) infoWindow.findViewById(R.id.b1);
    infoButton2 = (Button) infoWindow.findViewById(R.id.b2);

    infoButtonListener = new OnInfoWindowElemTouchListener(infoButton1,
        getResources().getDrawable(R.drawable.ic_launcher),
        getResources().getDrawable(R.drawable.ic_launcher)) {
      @Override
      protected void onClickConfirmed(View v, Marker marker) {
        Toast.makeText(getApplicationContext(),
            "click on button 1", Toast.LENGTH_LONG).show();
      }
    };
    infoButton1.setOnTouchListener(infoButtonListener);


    infoButtonListener = new OnInfoWindowElemTouchListener(infoButton2,
        getResources().getDrawable(R.drawable.ic_launcher),
        getResources().getDrawable(R.drawable.ic_launcher)) {
      @Override
      protected void onClickConfirmed(View v, Marker marker) {
        Toast.makeText(getApplicationContext(),
            "click on button 2", Toast.LENGTH_LONG).show();
      }
    };
    infoButton2.setOnTouchListener(infoButtonListener);

    infoWindow.setOnClickListener(new OnClickListener() {
      @Override
      public void onClick(View v) {
        // TODO Auto-generated method stub
      }
    });

    map.setInfoWindowAdapter(new InfoWindowAdapter() {
      @Override
      public View getInfoWindow(Marker marker) {
        infoButtonListener.setMarker(marker);
        mapWrapperLayout.setMarkerWithInfoWindow(marker, infoWindow);
        return infoWindow;
      }

      @Override
      public View getInfoContents(Marker marker) {
        // Setting up the infoWindow with current's marker info
        return null;
      }
    });
    ki.showInfoWindow();

    map.moveCamera(CameraUpdateFactory.newLatLngZoom(new LatLng(50.08, 14.43), 15));
    map.animateCamera(CameraUpdateFactory.zoomTo(10), 2000, null);
  }

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

activity_main

<RelativeLayout xmlns:Android="http://schemas.Android.com/apk/res/Android"
    xmlns:tools="http://schemas.Android.com/tools"
    Android:layout_width="match_parent"
    Android:layout_height="match_parent"
    Android:paddingBottom="@dimen/activity_vertical_margin"
    Android:paddingLeft="@dimen/activity_horizontal_margin"
    Android:paddingRight="@dimen/activity_horizontal_margin"
    Android:paddingTop="@dimen/activity_vertical_margin"
    tools:context=".MainActivity" >

    <LinearLayout
        Android:layout_height="wrap_content"
        Android:layout_width="wrap_content"
        Android:background="@drawable/marker" >

        <Button 
            Android:id="@+id/b1"
            Android:layout_height="wrap_content"
            Android:layout_width="wrap_content"
            Android:text="Button1" 
            Android:layout_marginBottom="10dp"   />

        <Button 
            Android:id="@+id/b2"
            Android:layout_height="wrap_content"
            Android:layout_width="wrap_content"
            Android:text="Button2"
            Android:layout_marginBottom="10dp"    />

    </LinearLayout>
</RelativeLayout>

copiez maintenant les fichiers suivants à partir du lien https://stackoverflow.com/a/15040761/2183804

  1. mapwrapperlauot (inclure le nom de votre package dans la balise)
  2. MapWrapperLayout.Java
  3. OnInfoWindowElemTouchListener.Java

Ça va marcher.

4
swati srivastav

Ce que vous essayez d'atteindre n'est pas possible. Même si vous créez une disposition XML pour votre fenêtre d'informations, le contenu de la fenêtre d'informations est rendu et présenté sous forme d'image sur les cartes. Il ne peut donc accepter qu'un seul écouteur de clic pour toute la fenêtre. Vous ne pouvez pas spécifier plusieurs écouteurs de clic pour une fenêtre.

MISE À JOUR: De la Docs :

Remarque: La fenêtre d'informations qui est dessinée n'est pas une vue en direct. La vue est rendue sous forme d'image (à l'aide de View.draw (Canvas)) au moment où elle est renvoyée. Cela signifie que toute modification ultérieure de la vue ne sera pas reflétée par la fenêtre d'informations sur la carte. Pour mettre à jour la fenêtre d'informations ultérieurement (par exemple, après le chargement d'une image), appelez showInfoWindow (). De plus, la fenêtre d'information ne respectera aucune de l'interactivité typique d'une vue normale telle que les événements tactiles ou gestuels. Cependant, vous pouvez écouter un événement de clic générique sur toute la fenêtre d'informations, comme décrit dans la section ci-dessous.

3
Emil Adz

J'ai construit un exemple de projet Android studio pour cette question.

captures d'écran de sortie: -

enter image description here

enter image description here

enter image description here

Télécharger le code source complet du projet Cliquez ici

Veuillez noter: vous devez ajouter votre clé API dans Androidmanifest.xml

3

Il existe en fait une bibliothèque qui peut résoudre votre problème et ajouter une fenêtre d'informations qui est une vue en direct et vous pouvez interagir avec elle.

https://github.com/Appolica/InteractiveInfoWindowAndroid

2
Deyan Genovski