android – IllegalStateException:填充后视图大小太小

我正在开发一个 Android应用程序.在这个应用程序中,我在片段中显示MapView.如果我的设备旋转,我尝试使用以下方法之一移动相机:

mapa.animateCamera(的CameraUpdate);

要么

mapa.moveCamera(的CameraUpdate);

然后我的应用程序崩溃并显示以下错误

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)

我用Google搜索但没有成功.我刚刚发现它是谷歌报道的问题,但我不知道是否有任何解决方法来“解决”这个问题.任何人都可以帮助我吗?

编辑:我正在添加更多代码

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

这是单击MyLocationButton的时间:

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

这是MapUtils.centrarCamara()方法

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

    public static void centrarCamara(Context contexto,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;
}

调用mapa.moveCamera()或mapa.animateCamera()时发生异常;

解决方法

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.

因此,当您调用mapa.animateCamera(cameraUpdate)或mapa.moveCamera(cameraUpdate)时,您的问题可能是地图没有大小.

无论如何,正如你所说旋转你的设备时抛出异常,我会说真正的问题是你在调用newLatLngBounds(ViewUtils.dpAPixeles(MARKERS_DP_OFFSET,contexto))时使用的填充引起了问题(也许填充大于View的高度/ 2?).有一个与Google地图相关的注册问题(4773)可以帮助您解决问题.如上所述,一种可能的解决方法是根据方向设置cameraUpdate:

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

相关文章

这篇“android轻量级无侵入式管理数据库自动升级组件怎么实现...
今天小编给大家分享一下Android实现自定义圆形进度条的常用方...
这篇文章主要讲解了“Android如何解决字符对齐问题”,文中的...
这篇文章主要介绍“Android岛屿数量算法怎么使用”的相关知识...
本篇内容主要讲解“Android如何开发MQTT协议的模型及通信”,...
本文小编为大家详细介绍“Android数据压缩的方法是什么”,内...