J'ai intégré Google MAP API V2 pour Android. Je souhaite disposer d’une fenêtre d’informations personnalisées à l’Onclick de My Marker. Jusqu'à ça, c'est bien. je l'ai intégré.
Ce que je veux: Je veux afficher ma fenêtre d'informations personnalisées sur le côté droit du marqueur au lieu du haut du marqueur.
Vous trouverez ci-dessous le code que j'utilise:
public class MainActivity extends FragmentActivity {
private MainMapFragement mapFragment;
private HashMap<Marker, EventInfo> eventMarkerMap;
Marker ThirdMarker;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
mapFragment = new MainMapFragement();
// FragmentTransaction ft = getFragmentManager().beginTransaction();
FragmentTransaction ft = getSupportFragmentManager().beginTransaction();
ft.add(R.id.map, mapFragment);
ft.commit();
}
@Override
protected void onStart() {
super.onStart();
setUpEventSpots();
}
private void setUpEventSpots() {
// I'm going to make 2 EventInfo objects and place them on the map
EventInfo firstEventInfo = new EventInfo(new LatLng(50.154, 4.35),
"Right now - event", new Date(), "Party");
EventInfo secondEventInfo = new EventInfo(new LatLng(51.25, 4.15),
"Future Event", new Date(1032, 5, 25), "Convention");
EventInfo thirdEventInfo = new EventInfo(new LatLng(23.25, 72.15),
"Our Next Event", new Date(), "Ahmedabad-India");
// this date constructor is deprecated but it's just to make a simple
// example
Marker firstMarker = mapFragment.placeMarker(firstEventInfo);
Marker secondMarker = mapFragment.placeMarker(secondEventInfo);
ThirdMarker = mapFragment.placeMarker(thirdEventInfo);
eventMarkerMap = new HashMap<Marker, EventInfo>();
eventMarkerMap.put(firstMarker, firstEventInfo);
eventMarkerMap.put(secondMarker, secondEventInfo);
eventMarkerMap.put(ThirdMarker, thirdEventInfo);
// add the onClickInfoWindowListener
mapFragment.getMap().setOnInfoWindowClickListener(
new OnInfoWindowClickListener() {
@Override
public void onInfoWindowClick(Marker marker) {
EventInfo eventInfo = eventMarkerMap.get(marker);
Toast.makeText(
getBaseContext(),
"The date of "
+ eventInfo.getName()
+ " is "
+ eventInfo.getSomeDate()
.toLocaleString(),
Toast.LENGTH_LONG).show();
}
});
// Custom Bhavesh
mapFragment.getMap().setInfoWindowAdapter(new InfoWindowAdapter() {
private final View window = getLayoutInflater().inflate(
R.layout.ballonoverlly, null);
@Override
public View getInfoWindow(Marker marker) {
EventInfo eventInfo = eventMarkerMap.get(marker);
String title = marker.getTitle();
TextView txtTitle = ((TextView) window
.findViewById(R.id.textview_name));
if (title != null) {
// Spannable string allows us to edit the formatting of the
// text.
SpannableString titleText = new SpannableString(title);
titleText.setSpan(new ForegroundColorSpan(Color.RED), 0,
titleText.length(), 0);
txtTitle.setText(titleText);
} else {
txtTitle.setText("");
}
// TextView txtType = ((TextView) window
// .findViewById(R.id.textview_aboutme));
// if (eventInfo.getType() != null)
// txtType.setText(eventInfo.getType());
return window;
}
@Override
public View getInfoContents(Marker marker) {
// this method is not called if getInfoWindow(Marker) does not
// return null
return null;
}
});
}
}
fichier xml:
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:Android="http://schemas.Android.com/apk/res/Android"
Android:id="@+id/RlMain"
Android:layout_width="wrap_content"
Android:layout_height="wrap_content" >
<LinearLayout
Android:id="@+id/imageview_comment"
Android:layout_width="150dp"
Android:layout_height="62dp"
Android:background="@drawable/map_comment_back"
Android:gravity="center_vertical"
Android:orientation="vertical"
Android:scaleType="fitXY"
Android:visibility="visible" >
<TextView
Android:id="@+id/textview_name"
Android:layout_width="wrap_content"
Android:layout_height="wrap_content"
Android:layout_centerVertical="true"
Android:layout_marginLeft="10dp"
Android:text="Bhavesh Patadiya"
Android:textColor="#FFFFFF"
Android:textStyle="bold" />
<TextView
Android:id="@+id/textview_aboutme"
Android:layout_width="wrap_content"
Android:layout_height="wrap_content"
Android:layout_centerVertical="true"
Android:layout_marginLeft="10dp"
Android:maxLines="2"
Android:text="How's Going?"
Android:textColor="#FFFFFF"
Android:textStyle="normal" />
</LinearLayout>
</LinearLayout>
Ci-dessous, la capture d'écran de ce que je reçois:
Maintenant, je veux avoir mon InfoWindow personnalisé sur le côté droit du marqueur au lieu de Haut.
Toutes les aides sont appréciées.
Merci d'avance.
Éditer 2:
À partir de septembre, la mise à jour (v12 ou 3.2.65) de l'API Google Maps Android v2 - MarkerOptions.infoWindowAnchor a été ajoutée. Il y a pas mal de nouvelles fonctions, donc vérifiez notes de version aussi.
Éditer 3:
Malheureusement, cet ajout ne résout pas encore votre problème. Ajouté nouveau numéro pour cela.
Ce n'est pas possible actuellement.
Essayer de le contourner en mettant une View
sur MapFragment
peut être une bonne solution si les utilisateurs ne sont pas autorisés à déplacer la carte. S'ils le peuvent, vous constaterez de mauvais décalages lors du repositionnement lorsque vous utilisez "Push techonology" onCameraChange
ou interrogation avec Handler
et map.getCameraPosition()
.
Même problème si vous essayez d’utiliser un marqueur supplémentaire avec une icône transparente pour afficher la fenêtre d’information lorsque vous cliquez sur le visible, mais il serait plus amusant de le voir réellement mis en œuvre.
Si vous pouvez vivre sans fenêtre d'information à droite pour le moment, je vous suggérerais de mettre en vedette cette fonctionnalité déjà demandée et d'attendre.
Modifier:
À partir de la version 3.1.36 (rév. 7) de l'API v2, vous pouvez modifier l'icône du marqueur. Cela signifie que vous pouvez créer deux icônes: l'une normale et l'autre qui ressemble à une fenêtre d'information ouverte à droite. Désactiver l'ouverture de la fenêtre d'informations par défaut et l'utiliser à la place pourrait fonctionner pour vous.
Vous pouvez faire en convertissant simplement marker.getPosition () en screenPosition comme ci-dessous code
Projection projection = map.getProjection();
LatLng markerLocation = marker.getPosition();
Point screenPosition = projection.toScreenLocation(markerLocation);
int x = screenPosition.x +marker. markerImage.getWidth();
Vous pouvez consulter le lien ci-dessous pour plus d'informations (qui convertissent getPosition en projection):
Comment obtenir les coordonnées de l'écran du marqueur dans Google Maps v2 Android