web-dev-qa-db-fra.com

Fenêtre d'information personnalisée dans Google map Android v2

J'utilise Google Map API V2 et j'ai créé un InfoWindow personnalisé pour un Marker sur la carte. Dans ce InfoWindow j'ai un bouton.

Mon problème est incapable de définir Onclicklistener/fonctionnement sur ce bouton (factice) .Tout le monde me donne une idée pour résoudre ce problème:

enter image description here

Voici un extrait de code:

public class MarkerView extends FragmentActivity implements OnMarkerClickListener,OnInfoWindowClickListener{

private GoogleMap mMap;
private Marker chennai;
private View infoWindow;
@Override
protected void onCreate(Bundle arg0) {
    super.onCreate(arg0);
    setContentView(R.layout.basic_demo);

    infoWindow=getLayoutInflater().inflate(R.layout.custom_info_contents, null);

    mMap=((SupportMapFragment) getSupportFragmentManager().findFragmentById(R.id.map)).getMap();
    chennai=mMap.addMarker(new MarkerOptions().position(new LatLng(13.0810, 80.274)).anchor(2, 1).title("Android").snippet("Snippet").icon(BitmapDescriptorFactory.fromResource(R.drawable.ic_launcher)));
    mMap.setInfoWindowAdapter(new CustomInfoAdapter());
    mMap.setOnInfoWindowClickListener(null);
    mMap.setOnMarkerClickListener(this);
    Button dummy=(Button) infoWindow.findViewById(R.id.dummy);
    dummy.setVisibility(View.VISIBLE);
    dummy.setOnClickListener(new OnClickListener() {

        @Override
        public void onClick(View v) {
            Toast.makeText(MarkerView.this, "Dummy Button", Toast.LENGTH_SHORT).show();

        }
    });
}


class CustomInfoAdapter implements InfoWindowAdapter{


    @Override
    public View getInfoContents(Marker arg0) {
        displayView(arg0);
        return infoWindow;
    }

    @Override
    public View getInfoWindow(Marker arg0) {

        return null;
    }


}


public void displayView(Marker arg0) {

    ((ImageView)infoWindow.findViewById(R.id.badge)).setImageResource(R.drawable.arrow);
    ((ImageView)infoWindow.findViewById(R.id.badge)).setOnClickListener(new OnClickListener() {

        @Override
        public void onClick(View v) {
            Toast.makeText(MarkerView.this, "Arrow Image", Toast.LENGTH_SHORT).show();

        }
    });
     ((TextView)infoWindow.findViewById(R.id.title)).setText(arg0.getTitle());
     ((TextView)infoWindow.findViewById(R.id.snippet)).setText(arg0.getTitle());

}


@Override
public boolean onMarkerClick(Marker arg0) {
    if(arg0.equals(chennai)){

        infoWindow.setClickable(false);

    }
    return false;
}


@Override
public void onInfoWindowClick(Marker arg0) {
    Toast.makeText(MarkerView.this, "Info window", Toast.LENGTH_SHORT).show();
}
33
SBK

Veuillez consulter les événements de clic de la fenêtre d'informations dans ce lien

La fenêtre d'informations n'est pas une vue en direct, mais la vue est rendue sous forme d'image sur la carte. Par conséquent, tous les écouteurs que vous définissez sur la vue sont ignorés et vous ne pouvez pas distinguer les événements de clic sur différentes parties de la vue. Il est conseillé de ne pas placer de composants interactifs - tels que des boutons, des cases à cocher ou des entrées de texte - dans votre fenêtre d'informations personnalisée.

33
TamiL

Vous devez implémenter un marqueur personnalisé; C'est comme ça:

custommarker.xml

<?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:layout_gravity="center_vertical|center_horizontal"
Android:background="#ADD8E6"
Android:gravity="center_vertical|center_horizontal"
Android:orientation="horizontal" >

<ImageView
    Android:layout_width="wrap_content"
    Android:layout_height="wrap_content"
    Android:layout_marginRight="5dp"
    Android:adjustViewBounds="true"
    Android:contentDescription="@string/app_name"
    Android:src="@drawable/sabarmati" />

<LinearLayout
    Android:layout_width="wrap_content"
    Android:layout_height="wrap_content"
    Android:orientation="vertical" >

    <TextView
        Android:id="@+id/snippet"
        Android:layout_width="wrap_content"
        Android:layout_height="wrap_content"
        Android:padding="5dp"
        Android:textColor="@Android:color/black"
        Android:textSize="15sp" />

    <TextView
        Android:id="@+id/title"
        Android:layout_width="wrap_content"
        Android:layout_height="wrap_content"
        Android:padding="5dp"
        Android:textColor="@Android:color/black"
        Android:textSize="10sp"
        Android:textStyle="bold" />
</LinearLayout>

</LinearLayout>

Activité:

public class PlacesMapActivity extends Android.support.v4.app.FragmentActivity
    implements OnClickListener, LocationListener {
/**
 * Note that this may be null if the Google Play services APK is not
 * available.
 */
ImageButton btn_home;
private GoogleMap mMap;

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

    SupportMapFragment fragment =   (SupportMapFragment)getSupportFragmentManager()
            .findFragmentById(R.id.map);
    mMap = fragment.getMap();
    mMap.setMyLocationEnabled(true);

    // mMap = ((SupportMapFragment) getSupportFragmentManager()
    // .findFragmentById(R.id.map)).getMap();

    MarkerOptions markerOptions = new MarkerOptions();
    markerOptions.title("First Location");
    markerOptions.snippet("This Is Test Location");

    LatLng latlng = new LatLng(23.0333, 72.6167);

    markerOptions.position(latlng);
    // markerOptions.title("Ahmedabad Cordinat Found here");

    // Marker m = mMap.addMarker(markerOptions);

    ***mMap.setInfoWindowAdapter(new InfoWindowAdapter() {
        @Override
        public View getInfoWindow(Marker arg0) {
            return null;
        }
        @Override
        public View getInfoContents(Marker marker) {
            View myContentView = getLayoutInflater().inflate(
                    R.layout.custommarker, null);
            TextView tvTitle = ((TextView) myContentView
                    .findViewById(R.id.title));
            tvTitle.setText(marker.getTitle());
            TextView tvSnippet = ((TextView) myContentView
                    .findViewById(R.id.snippet));
            tvSnippet.setText(marker.getSnippet());
            return myContentView;
        }
    });***

    mMap.addMarker(new MarkerOptions()
            .position(latlng)
            .title("This is Sabarmati Ashram")
            .snippet("Ahmedabad")
            .icon(BitmapDescriptorFactory
                .defaultMarker(BitmapDescriptorFactory.HUE_RED)));

    mMap.setOnInfoWindowClickListener(new OnInfoWindowClickListener() {

        @Override
        public void onInfoWindowClick(Marker arg0) {
            // TODO Auto-generated method stub
            Intent intent = new Intent(getBaseContext(),
                    DetailsOfPlacesActivity.class);
            startActivity(intent);
        }
    });

    btn_home = (ImageButton) findViewById(R.id.activity_map_ibtn_home);
    btn_home.setOnClickListener(new OnClickListener() {

        @Override
        public void onClick(View v) {
            // TODO Auto-generated method stub
            finish();
        }
    });
}
}
19
Teraiya Mayur

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

Vous pouvez donc créer une infowindow personnalisée Google map v2 avec des boutons cliquables ou ImageView, etc.,

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

1

Vous ne pouvez pas cliquer sur le bouton pour la raison expliquée par @TamiL .
Cependant, vous pouvez cliquer sur InfoWindow, donc, stockez les ID des Marker (s) dont les InfoWindow (s) doivent être cliquables. , ajouter un GoogleMap.OnInfoWindowClickListener à la carte comme ceci:

map.setOnInfoWindowClickListener(new GoogleMap.OnInfoWindowClickListener()
{
    @Override
    public void onInfoWindowClick(Marker marker)
    {
        // Called when ANY InfoWindow is clicked
    }
});

Ensuite, lorsque onInfoWindowClick est appelé, comparez l'ID de Marker cliqué avec ceux que vous avez stockés plus tôt, et si l'un d'eux correspond, exécutez le code à exécuter dans le Button.

Vous n'avez pas à gérer l'enregistrement de Marker ID: s si tous vos Marker s InfoWindow vont être cliquables!

0
Daniel Kvist

Les éléments d'interface utilisateur dans InfoWindow qui apparaissent sur les marqueurs de Google Maps ne sont pas cliquables. Il est donc préférable d'utiliser des fenêtres contextuelles personnalisées.

0
Anand S Joshi