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?
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 .
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
Ça va marcher.
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.
J'ai construit un exemple de projet Android studio pour cette question.
captures d'écran de sortie: -
Télécharger le code source complet du projet Cliquez ici
Veuillez noter: vous devez ajouter votre clé API dans Androidmanifest.xml
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.