我正在开发一个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, 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;
}
调用mapa.moveCamera()
或mapa.animateCamera()
时会发生异常;
答案 0 :(得分:6)
在地图出现之前,请勿使用此相机更新更换相机 经历布局(为了使这种方法正确地确定 适当的边界框和缩放级别,地图必须有一个大小)。 否则将抛出IllegalStateException。它不是 足以使地图可用(即getMap()返回一个 非空对象);包含地图的视图也必须经历过 布局使其尺寸已确定。如果你不能 确定已发生这种情况,请使用newLatLngBounds(LatLngBounds,int, 改为int,int)并手动提供地图的尺寸。
因此,当您致电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, ViewUtils.dpAPixeles(MARKERS_DP_OFFSET, contexto));
} else {
// Use another method to get your camera update, for example CameraUpdateFactory.newLatLng(latLng);
}
答案 1 :(得分:3)
我已经尝试了很多解决方案,但没有一个真正解决了我的问题,即填充超出了地图的实际大小。
我的解决方案只是一个小填充,然后缩小以得到相同的结果。
此代码来自我的应用,它对我来说很好。
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));
}
答案 2 :(得分:2)
对于Android,我还尝试了各种解决方案,并最终找到了崩溃的主要原因。
崩溃的主要原因是Android 7-7.1.2(API:24 – 25)中的分屏支持/多窗口支持。
LatLngBounds,根据设备宽度的百分比设置了填充,以便在小型设备上使用。 即使在具有4英寸显示屏的小型设备上也可以使用,但是,例如,在Android 7.0中的多窗口模式下以及在支持多窗口模式的设备上,该方法将失败。 Galaxy S7。
解决方案是在宽度和高度之间选择最小度量标准,因为在多窗口模式下,高度可以小于宽度:
final int width = getResources().getDisplayMetrics().widthPixels;
final int height = getResources().getDisplayMetrics().heightPixels;
final int minMetric = Math.min(width, height);
final int padding = (int) (minMetric * paddingPercentage);
您可以根据需要选择填充百分比。
对于移动相机,
googleMap.moveCamera(CameraUpdateFactory.newLatLngBounds(bounds.build(), width, height, padding));
对于Animate Camera,
googleMap.animateCamera(CameraUpdateFactory.newLatLngBounds(bounds.build(), width, height, padding));
答案 3 :(得分:0)
将填充300设置为150.它适合我。
map.animateCamera(
CameraUpdateFactory.newLatLngBounds(boundsLatLongs, 150),
1000, null);
答案 4 :(得分:0)
解决方案是为地图视图组件提供最小宽度和高度,因为它在父视图之前布局。
答案 5 :(得分:0)
我在下面的解决方案可以在大约60%分辨率较小的屏幕(1280x720)(代码为Kotlin)的屏幕上工作的地图
val builder = LatLngBounds.Builder()
//storing the MarkerOptions in a hashmap
builder.include(markers[MarkerType.START]?.position)
builder.include(markers[MarkerType.END]?.position)
val bounds = builder.build()
val width = resources.displayMetrics.widthPixels
val height = resources.displayMetrics.heightPixels
val minMetric = min(width, height)
//divide the smallest screen value by 10 , to get a value around 100
val padding = minMetric.div(10)
val cu = CameraUpdateFactory.newLatLngBounds(bounds, padding)
googleMap?.animateCamera(cu)