我正在尝试使用RelativeLayout
作为自定义InfoWindow
作为我的标记,但每次调用NullPointerException
时我都会showInfoWindow
(通过点按Marker
或以编程方式)。我正在使用Google Maps Android API v2。
例外:
FATAL EXCEPTION: main
java.lang.NullPointerException
at android.widget.RelativeLayout.onMeasure(RelativeLayout.java:465)
at android.view.View.measure(View.java:15172)
at maps.a.y.i(Unknown Source)
at maps.a.y.a(Unknown Source)
at maps.a.w.a(Unknown Source)
at maps.a.bd.a(Unknown Source)
at maps.y.bw.b(Unknown Source)
at maps.y.bw.a(Unknown Source)
at maps.a.dh.a(Unknown Source)
at maps.a.n.c(Unknown Source)
at maps.a.dw.a(Unknown Source)
at maps.a.bd.c(Unknown Source)
at maps.a.dq.onSingleTapConfirmed(Unknown Source)
at maps.e.v.onSingleTapConfirmed(Unknown Source)
at maps.e.j.handleMessage(Unknown Source)
...
我的代码:
* custom_infowindow.xml *
<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:padding="10dip" >
<ImageView
android:id="@+id/icon"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_alignParentRight="true"
android:paddingLeft="10dip"
android:paddingRight="10dip"
android:paddingTop="5dip"
android:src="@drawable/icon" />
<TextView
android:id="@+id/title"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_toLeftOf="@id/icon"
android:ellipsize="end"
android:paddingLeft="10dip"
android:paddingRight="10dip"
android:singleLine="true" />
<TextView
android:id="@+id/snippet"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_below="@id/title"
android:layout_toLeftOf="@id/icon"
android:ellipsize="end"
android:paddingBottom="10dip"
android:paddingLeft="10dip"
android:paddingRight="10dip"
android:singleLine="true" />
</RelativeLayout>
CustomInfoWindowAdapter.java
public class CustomInfoWindowAdapter implements InfoWindowAdapter {
private View layout;
private LayoutInflater inflater;
public CustomInfoWindowAdapter(Context context) {
inflater = LayoutInflater.from(context);
}
@Override
public View getInfoContents(Marker marker) {
return null;
}
@Override
public View getInfoWindow(Marker marker) {
ViewHolder holder;
if (layout == null) {
layout = inflater.inflate(R.layout.custom_infowindow, null);
holder = new ViewHolder();
holder.title = (TextView) layout.findViewById(R.id.title);
holder.snippet = (TextView) layout.findViewById(R.id.snippet);
layout.setTag(holder);
} else {
holder = (ViewHolder) layout.getTag();
}
holder.title.setText(marker.getTitle());
holder.snippet.setText(marker.getSnippet());
return layout;
}
static class ViewHolder {
TextView title;
TextView snippet;
}
}
有趣的是,如果我使用LinearLayout
代替它可以正常工作,但如果可能,我宁愿只使用一个ViewGroup
。当然,我想知道onMeasure
投掷NullPointerException
会发生什么。
编辑:此外,将RelativeLayout
包裹在FrameLayout
或LinearLayout
内也可以。当然,将其包含在另一个RelativeLayout
内也不会。
答案 0 :(得分:27)
我遇到了这个问题,并且能够通过添加
来修复它view.setLayoutParams(new ViewGroup.LayoutParams(desiredWidth,desiredHeight));
在从InfoWindowAdapter.getInfoWindow 返回视图之前到视图
答案 1 :(得分:24)
刚刚发现在android版本中&lt; 4.4这会生成一个nullpointer异常。使用Linear改变布局将解决问题。
答案 2 :(得分:4)
即使我的xml中没有RelativeLayout,我也遇到过这个问题。事实证明,我的类支持继承自RelativeLayout的XML,即使它是一个LinearLayout。
它并没有导致几个不同设备的错误,但是当我尝试使用我的S3时它崩溃了。
无论如何,只需删除或包装RelativeLayout或首先设置布局高度/宽度。