2015-10-09 17 views
5

Sto sviluppando un'app per Android. In questa app sto mostrando un MapView in un frammento. Se il mio dispositivo è ruotato e cerco di spostare la telecamera utilizzando uno dei seguenti metodi:IllegalStateException: dimensioni della vista troppo piccole dopo il riempimento

mapa.animateCamera(cameraUpdate);

o

mapa.moveCamera(cameraUpdate);

Poi i miei applicazione si blocca e mostra il seguente errore:

java.lang.IllegalStateException: View size is too small after padding 
at com.google.a.a.ab.b(Unknown Source) 
at com.google.maps.api.android.lib6.gmm6.c.a.a(Unknown Source) 
at com.google.maps.api.android.lib6.gmm6.c.a.a(Unknown Source) 
at com.google.maps.api.android.lib6.d.dw.a(Unknown Source) 
at com.google.maps.api.android.lib6.gmm6.c.a.a(Unknown Source) 
at com.google.maps.api.android.lib6.d.et.a(Unknown Source) 
at com.google.android.gms.maps.internal.j.onTransact(SourceFile:83) 
at android.os.Binder.transact(Binder.java:380) 
at com.google.android.gms.maps.internal.IGoogleMapDelegate$zza$zza.moveCamera(Unknown Source) 
at com.google.android.gms.maps.GoogleMap.moveCamera(Unknown Source) 
at com.accionplus.dbdplus.utils.MapUtils.centrarCamara(MapUtils.java:88) 
at com.accionplus.dbdplus.utils.MapUtils.centrarCamara(MapUtils.java:52) 
at com.accionplus.dbdplus.controladores.pdv.RutaProgramadaFragment$4.onMyLocationButtonClick(RutaProgramadaFragment.java:274) 
at com.google.android.gms.maps.GoogleMap$3.onMyLocationButtonClick(Unknown Source) 
at com.google.android.gms.maps.internal.zzo$zza.onTransact(Unknown Source) 
at android.os.Binder.transact(Binder.java:380) 
at com.google.android.gms.maps.internal.be.a(SourceFile:81) 
at com.google.maps.api.android.lib6.d.ak.onClick(Unknown Source) 
at android.view.View.performClick(View.java:5156) 
at android.view.View$PerformClick.run(View.java:20755) 
at android.os.Handler.handleCallback(Handler.java:739) 
at android.os.Handler.dispatchMessage(Handler.java:95) 
at android.os.Looper.loop(Looper.java:145) 
at android.app.ActivityThread.main(ActivityThread.java:5832) 
at java.lang.reflect.Method.invoke(Native Method) 
at java.lang.reflect.Method.invoke(Method.java:372) 
at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:1399) 
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:1194) 

Ho cercato su google ma senza successo. Ho appena scoperto che si trattava di un problema segnalato per Google, ma non so se c'è qualche soluzione per "risolvere" questo problema. Qualcuno può aiutarmi?

EDIT: sto aggiungendo più di codice

<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" 
       tools:context="com.accionplus.dbdplus.controladores.pdv.RutaProgramadaActivity"> 

    <LinearLayout 
     android:id="@+id/card_container" 
     android:layout_width="match_parent" 
     android:layout_height="wrap_content" 
     android:background="#15000000" 
     android:orientation="vertical"/> 

    <LinearLayout 
     android:id="@+id/filtro_ll" 
     android:layout_width="match_parent" 
     android:layout_height="wrap_content" 
     android:layout_below="@+id/card_container" 
     android:layout_margin="10dp" 
     android:gravity="left|top" 
     android:orientation="horizontal" 
     android:weightSum="1"> 

     <LinearLayout 
      android:layout_width="0dp" 
      android:layout_height="match_parent" 
      android:layout_weight="0.7" 
      android:gravity="left|top" 
      android:orientation="vertical"> 

      <LinearLayout 
       android:layout_width="match_parent" 
       android:layout_height="wrap_content" 
       android:gravity="left" 
       android:orientation="horizontal" 
       android:weightSum="1"> 

       <ImageButton 
        android:id="@+id/seleccionar_fecha_btn" 
        android:layout_width="wrap_content" 
        android:layout_height="35dp" 
        android:background="@drawable/button" 
        android:src="@drawable/ic_date" 
        android:text="@string/buscar" 
        android:textColor="@color/color_text_primary"/> 

       <TextView 
        android:id="@+id/fecha_consulta_tv" 
        android:layout_width="match_parent" 
        android:layout_height="35dp" 
        android:layout_alignParentTop="true" 
        android:layout_marginLeft="5dp" 
        android:background="@drawable/rectangle" 
        android:gravity="center"/> 
      </LinearLayout> 

      <LinearLayout 
       android:layout_width="match_parent" 
       android:layout_height="wrap_content" 
       android:layout_marginTop="10dp" 
       android:background="@drawable/rectangle"> 

       <Spinner 
        android:id="@+id/tipo_ruta_sp" 
        android:layout_width="fill_parent" 
        android:layout_height="35dp" 
        android:layout_gravity="center" 
        /> 
      </LinearLayout> 

     </LinearLayout> 
    </LinearLayout> 

    <com.google.android.gms.maps.MapView 
     android:id="@+id/map" 
     android:layout_width="match_parent" 
     android:layout_height="match_parent" 
     android:layout_below="@+id/filtro_ll"/> 

    <ProgressBar 
     android:id="@+id/progress_bar" 
     android:layout_width="wrap_content" 
     android:layout_height="wrap_content" 
     android:layout_centerHorizontal="true" 
     android:foregroundGravity="center|top" 
     android:visibility="gone"/> 

</RelativeLayout> 

Ecco quando si fa clic MyLocationButton:

mMap.setOnMyLocationButtonClickListener(new GoogleMap.OnMyLocationButtonClickListener() { 
      @Override 
      public boolean onMyLocationButtonClick() { 
       MapUtils.centrarCamara(getActivity(), mMap, mPuntosFinales); 
       return true; 
      } 
     }); 

Ecco MapUtils.centrarCamara() metodo:

public static void centrarCamara(Context contexto, GoogleMap mapa, LatLng... posiciones) { 
     centrarCamara(contexto, mapa, Boolean.TRUE, posiciones); 
    } 

    public static void centrarCamara(Context contexto, GoogleMap mapa, boolean animado, 
            LatLng... posiciones) { 
     if (mapa == null) { 
      return; 
     } 

     LatLngBounds.Builder builder = new LatLngBounds.Builder(); 
     for (LatLng posicion : posiciones) { 
      builder.include(posicion); 
     } 

     LatLngBounds bounds = builder.build(); 

     CameraUpdate cu = CameraUpdateFactory 
       .newLatLngBounds(bounds, ViewUtils.dpAPixeles(MARKERS_DP_OFFSET, contexto)); 

     if (animado) { 
      mapa.animateCamera(cu); 
     } else { 
      mapa.moveCamera(cu); 
     } 
    } 

ViewUtils.dpAPixeles:

public static int dpAPixeles(int dp, Context contexto) { 
    Resources r = contexto.getResources(); 
    int px = (int) TypedValue 
      .applyDimension(TypedValue.COMPLEX_UNIT_DIP, dp, r.getDisplayMetrics()); 

    return px; 
} 

L'eccezione occurrs quando mapa.moveCamera() o mapa.animateCamera() sono chiamati;

+0

Potresti pubblicare il codice che stai utilizzando per creare l'oggetto 'cameraUpdate'? – antonio

+0

Grazie per la risposta, @antonio. Ho pubblicato più codice – Antonio

risposta

4

Da the documentation

Do not change the camera with this camera update until the map has undergone layout (in order for this method to correctly determine the appropriate bounding box and zoom level, the map must have a size). Otherwise an IllegalStateException will be thrown. It is NOT sufficient for the map to be available (i.e. getMap() returns a non-null object); the view containing the map must have also undergone layout such that its dimensions have been determined. If you cannot be sure that this has occured, use newLatLngBounds(LatLngBounds, int, int, int) instead and provide the dimensions of the map manually.

Così, il problema potrebbe essere che la mappa non ha una dimensione in cui si sta chiamando o mapa.animateCamera(cameraUpdate)mapa.moveCamera(cameraUpdate).

Ad ogni modo, come tu dici che l'eccezione viene generata quando si ruota il dispositivo, direi che il vero problema è che l'imbottitura che si sta utilizzando al momento della chiamata newLatLngBounds (ViewUtils.dpAPixeles(MARKERS_DP_OFFSET, contexto)) sta causando problemi (forse l'imbottitura è più grande dell'altezza della vista/2?). C'è un problema registrato (4773) relativo a Google Maps che può aiutarti a risolvere il tuo problema. Come detto ci, una possibile soluzione è quella di impostare il cameraUpdate a seconda dell'orientamento:

if (getResources().getConfiguration().orientation == Configuration.ORIENTATION_PORTRAIT) { 
    cu = CameraUpdateFactory.newLatLngBounds(bounds, ViewUtils.dpAPixeles(MARKERS_DP_OFFSET, contexto)); 
} else { 
    // Use another method to get your camera update, for example CameraUpdateFactory.newLatLng(latLng); 
} 
+0

Grazie per la risposta, @antonio. Non ho trovato altro metodo chiamato "CameraUpdate.newLatLng (latLng);" per aggiornare la fotocamera. Potresti pubblicare un esempio per aggiornare la fotocamera, per favore? – Antonio

+0

@Antonio Oops ... hai ragione, errore mio, intendevo CameraUpdateFactory.newLatLng (latLng) (https://developers.google.com/android/reference/com/google/android/gms/maps/CameraUpdateFactory#newLatLng (com.google.android.gms.maps.model.LatLng)) – antonio

+0

Grazie, @antonio. La tua risposta ha funzionato perfettamente – Antonio

0

imbottiture di 300 a 150. farlo funzionare per me.

map.animateCamera(
       CameraUpdateFactory.newLatLngBounds(boundsLatLongs, 150), 
       1000, null); 
+1

Non funzionerà se la mappa viene inserita in un contenitore di piccole dimensioni. – Kaizie

2

ho provato un sacco di soluzione, ma nessuno di loro davvero risolvere il mio problema, che era l'imbottitura supera la dimensione effettiva della mappa.

la mia soluzione è solo una piccola imbottitura e quindi lo zoom indietro per dare lo stesso risultato.

questo codice proviene dalla mia app e funziona bene per me.

public static void fitThePoints(GoogleMap map, ArrayList<LatLng> points) { 
    //Calculate the markers to get their position 
    LatLngBounds.Builder b = new LatLngBounds.Builder(); 
    for (LatLng point : points) b.include(point); 

    //Change the padding as per needed 
    map.moveCamera(CameraUpdateFactory.newLatLngBounds(b.build(), ConvertUtils.dp2px(30))); 
    map.moveCamera(CameraUpdateFactory.zoomTo(map.getCameraPosition().zoom - 0.5f)); 
} 
0

Aveva l'errore con react-native-maps

soluzione era quella di dare la componente guarda la mappa di una larghezza minima e l'altezza, mentre veniva disposto prima della sua vista padre era.

Problemi correlati