2008-11-04 12 views
17

Estoy intentando que los controles del zoom aparezcan en un mapview, el siguiente código casi funciona, pero los controles del zoom aparecen en la parte superior izquierda del mapview, no en el centro inferior como estoy especificando a través de setGravity(). ¿Alguien me puede iluminar sobre lo que me estoy perdiendo?Colocación de controles de zoom en un MapView

zoomView = (LinearLayout) mapView.getZoomControls(); 
zoomView.setLayoutParams(new ViewGroup.LayoutParams(ViewGroup.LayoutParams.WRAP_CONTENT,ViewGroup.LayoutParams.WRAP_CONTENT)); 
zoomView.setGravity(Gravity.BOTTOM | Gravity.CENTER_HORIZONTAL); 
mapView.addView(zoomView); 

Estas vistas/diseños se construyen mediante programación, no hay un archivo de diseño para modificar.

Respuesta

0

Reto: el problema con el uso de FILL_PARENT es que el control del zoom "roba" todos los eventos táctiles; para que no pueda desplazarse por el mapa mientras los controles de zoom estén visibles. ¿Sabes cómo prevenir esto?

+0

Tienes razón. No lo había notado. Reemplazó la respuesta anterior con una mejor solución que evita este problema. –

19

El truco aquí es colocar otro contenedor de diseño en el que desee colocar los controles de zoom y luego insertar los controles de zoom en eso.

El verdadero truco es utilizar el RelativeLayout en lugar de LinearLayout para posicionar los elementos, como se muestra en esta muestra layout.xml:

<?xml version="1.0" encoding="utf-8"?> 
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" 
    android:layout_width="fill_parent" 
    android:layout_height="fill_parent"> 
    <com.google.android.maps.MapView 
    android:id="@+id/myMapView" 
    android:layout_width="fill_parent" 
    android:layout_height="fill_parent" 
    android:enabled="true" 
    android:clickable="true" 
    android:apiKey="MY_MAP_API_KEY" 
    /> 
    <LinearLayout android:id="@+id/layout_zoom" 
    android:layout_width="wrap_content" 
    android:layout_height="wrap_content" 
    android:layout_alignParentBottom="true" 
    android:layout_centerHorizontal="true" 
    /> 
</RelativeLayout> 

El layout_zoom elemento LinearLayout está posicionado en la parte inferior central de la pantalla, colocándolo sobre el medio/parte inferior de MapView.

Luego, dentro de su actividad de onCreate, obtener una referencia a la elemento layout_zoom e inserte el ZoomControl en ella, al igual que lo ha hecho ya:

LinearLayout zoomLayout =(LinearLayout)findViewById(R.id.layout_zoom); 
View zoomView = myMapView.getZoomControls(); 
zoomLayout.addView(zoomView, new LinearLayout.LayoutParams(LayoutParams.WRAP_CONTENT, LayoutParams.WRAP_CONTENT)); 
myMapView.displayZoomControls(true); 

Los ZoomControls deben aparecer ahora en un clic largo , sin robar los eventos táctiles del mapa.

+0

Hola, ¿puedo editar su respuesta para agregar una implementación en WebView? Solo un par de 4-5 líneas. Yo uso google y encontré esta solución. Pero, para usarlo en WebView, necesito modificar un poco. – ariefbayu

4

Reto: gracias por su respuesta, pero la idea era hacerlo sin utilizando diseños XML.

Finalmente resolví el problema. Como MapView es una subclase de ViewGroup, puede agregar fácilmente vistas secundarias (como los controles de zoom). Todo lo que necesita es una instancia de MapView.LayoutParams y listo. Hice algo como esto (coloca controles de zoom en la parte inferior central de la vista del mapa).

// layout to insert zoomcontrols at the bottom center of a mapview 
    MapView.LayoutParams params = MapView.LayoutParams(
    LayoutParams.WRAP_CONTENT, 
    LayoutParams.WRAP_CONTENT, 
    mapViewWidth/2, mapViewHeight, 
    MapView.LayoutParams.BOTTOM_CENTER); 

    // add zoom controls 
    mapView.addView(mapView.getZoomControls(), params); 
2

Desafortunadamente i cant dejar un comentario a Jason Hudgins aprobado solución del 28 de noviembre a las 6:32 pero me dio un pequeño error con su código:

En esta línea:

MapView.LayoutParams params = MapView.LayoutParams(

el error Eclipse me dio fue

"los LayoutParams método (int, int, int, int, int) no está definido para el th e tipo MapView "

en su lugar, creando un nuevo MapView.LayoutParams objeto fijo, como aquí:

MapView.LayoutParams params = **new** MapView.LayoutParams(

Me tomó un tiempo para averiguar, ya que soy un n00b: D

2

del google groups thread encontré esto:

ZoomControls sin XML:

public class MyMapActivity extends MapActivity { public void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 

     RelativeLayout relativeLayout = new RelativeLayout(this); 
     setContentView(relativeLayout); 

     final MapView mapView = new MapView(this, DEBUG_MAP_API_KEY); 
     RelativeLayout.LayoutParams mapViewLayoutParams = new 
RelativeLayout.LayoutParams 
(RelativeLayout.LayoutParams.FILL_PARENT,RelativeLayout.LayoutParams.FILL_PARENT); 
     relativeLayout.addView(mapView, mapViewLayoutParams); 

     RelativeLayout.LayoutParams zoomControlsLayoutParams = new 
RelativeLayout.LayoutParams(RelativeLayout.LayoutParams.WRAP_CONTENT, 
RelativeLayout.LayoutParams.WRAP_CONTENT); 
     zoomControlsLayoutParams.addRule 
(RelativeLayout.ALIGN_PARENT_BOTTOM); 
     zoomControlsLayoutParams.addRule 
(RelativeLayout.CENTER_HORIZONTAL); 

     relativeLayout.addView(mapView.getZoomControls(), 
zoomControlsLayoutParams); 

     mapView.setClickable(true); 
     mapView.setEnabled(true); 

} 

fue del 100% que trabaja para mí con SDK1.1

23

Agregue la siguiente línea al método de su MapView Clase OnCreate():

view.setBuiltInZoomControls(true);

7

Lo anterior no funcionó para mí, pero esto (para colocar el control en la parte inferior derecha):

mapView.setBuiltInZoomControls(true); 
ZoomButtonsController zbc = mapView.getZoomButtonsController(); 
ViewGroup container = zbc.getContainer(); 
for (int i = 0; i < container.getChildCount(); i++) { 
    View child = container.getChildAt(i); 
    if (child instanceof ZoomControls) { 
    FrameLayout.LayoutParams lp = (FrameLayout.LayoutParams) child.getLayoutParams(); 
    lp.gravity = Gravity.RIGHT | Gravity.BOTTOM; 
    child.requestLayout(); 
    break; 
    } 
} 
+0

Finalmente. Una respuesta que funciona SIN llamar al método obsoleto getZoomControls(). Felicitaciones a usted. Gracias. –

+0

Excelente, una solución mucho mejor que le permite conservar los controles de zoom incorporados completos con fade in/out. ¡Gracias! –

Cuestiones relacionadas