Подтвердить что ты не робот

Исключение NullPointerException при использовании RelativeLayout как пользовательского InfoWindow

Я пытаюсь использовать 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, бросая a NullPointerException.

РЕДАКТИРОВАТЬ: Кроме того, обертка RelativeLayout внутри a FrameLayout или LinearLayout будет работать. Разумеется, обертка его внутри другого RelativeLayout не будет.

4b9b3361

Ответ 1

У меня была эта проблема, и я смог ее исправить, добавив

view.setLayoutParams(new ViewGroup.LayoutParams(desiredWidth,desiredHeight));

прежде чем возвращать его из InfoWindowAdapter.getInfoWindow

Ответ 2

Просто выяснилось, что в версии для Android < 4.4 это генерирует исключение nullpointer. Изменение макета с помощью линейного решения проблемы.

Ответ 3

У меня возникла эта проблема, даже когда у меня не было RelativeLayout в моем xml. Оказывается, мой класс поддерживает XML, унаследованный от RelativeLayout, хотя это был LinearLayout.

Это не вызвало ошибку для нескольких разных устройств, но когда я попытался на моем S3, он разбился.

В любом случае просто удалите или заверните RelativeLayout или сначала установите высоту/ширину макета.