varios studio proyecto marcadores google example ejemplo agregar android google-maps custom-controls google-play-services

android - studio - Google map v2 Infowindow personalizado con dos botones seleccionables o ImageView



map fragment android studio (5)

Necesito una ventana de información personalizada con dos botones de clic como se muestra arriba. En ella, cuando haya más que un marcador y haga clic en cualquiera de ellos, la ventana debería estar abierta y al hacer clic en otro marcador, otra ventana debería abrir y cerrar la ventana anterior también con un solo clic. ¿hay alguna razón específica por la que google map v2 no admita componentes en vivo como el botón, casilla de verificación?



He construido un proyecto de estudio de Android de muestra para esta pregunta.

Capturas de pantalla de salida: -

Descargue el código fuente completo del proyecto Haga clic here

Tenga en cuenta que debe agregar su clave de API en Androidmanifest.xml


Lo que estás tratando de lograr es posible.

Puede ver la receta en esta respuesta: https://.com/a/15040761/2183804

Y una implementación de trabajo en Google Play .


Lo que estás tratando de lograr no es posible. Incluso si creas un diseño XML para tu ventana de información, los contenidos de la ventana de información se representan y se presentan como una imagen en los mapas. Por lo tanto, solo puede aceptar un escucha de clic para toda la ventana. No puede especificar varios escuchas de clic para una ventana.

ACTUALIZACIÓN: De los Docs :

Nota: La ventana de información que se dibuja no es una vista en vivo. La vista se representa como una imagen (usando View.draw (Canvas)) en el momento en que se devuelve. Esto significa que cualquier cambio posterior en la vista no se reflejará en la ventana de información en el mapa. Para actualizar la ventana de información más adelante (por ejemplo, después de que se haya cargado una imagen), llame a showInfoWindow (). Además, la ventana de información no respetará ninguna de la interactividad típica de una vista normal, como los eventos táctiles o de gestos. Sin embargo, puede escuchar un evento de clic genérico en toda la ventana de información como se describe en la sección a continuación.


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); } }

actividad_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>

Ahora copie los siguientes archivos desde el enlace https://.com/a/15040761/2183804

  1. mapwrapperlauot (incluya el nombre de su paquete en la etiqueta)
  2. MapWrapperLayout.java
  3. OnInfoWindowElemTouchListener.java

Funcionará.