将RelativeLayout用作自定义InfoWindow时出现NullPointerException

时间:2012-12-24 16:19:04

标签: android google-maps nullpointerexception google-maps-android-api-2

我正在尝试使用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包裹在FrameLayoutLinearLayout内也可以。当然,将其包含在另一个RelativeLayout内也不会。

3 个答案:

答案 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或首先设置布局高度/宽度。