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, бросающим NullPointerException.

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


person mbarrben    schedule 24.12.2012    source источник
comment
Теперь доступен новый API карт Google v2.   -  person Ali Imran    schedule 24.12.2012
comment
Извините, я не упомянул об этом явно: на самом деле я использую v2 API.   -  person mbarrben    schedule 24.12.2012
comment
Я видел, что это исключение происходит, когда вы пытаетесь получить ширину или высоту чего-либо до того, как будет взята ширина. Пример: попробуйте получить ширину до super(savedInstanceState) в onCreate действия. С картами не работал, поэтому не знаю, в чем тут дело.   -  person cjds    schedule 25.12.2012
comment
ты решил это? есть такая же проблема.   -  person Jay Gridley    schedule 17.01.2013
comment
Нет, @JayGridley, извини. Наконец, я решил использовать два вложенных LinearLayouts.   -  person mbarrben    schedule 24.01.2013


Ответы (3)


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

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

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

person ootinii    schedule 01.04.2013
comment
В зависимости от реализации вы можете иногда использовать 0 для ширины и высоты. Для меня layout.setLayoutParams(new ViewGroup.LayoutParams(0,0)); работал хорошо. - person Aron; 16.01.2017

Только что узнал, что в версии Android ‹ 4.4 это генерирует исключение нулевого указателя. Смена раскладки на Линейную решит проблему.

person Pizza    schedule 20.05.2014
comment
Спасибо, только что обернул весь RelativeLayout в LinearLayout. - person Akram; 27.08.2015
comment
Я согласен, я вижу это на Android 4.2. Похоже на java.lang.NullPointerException at android.widget.RelativeLayout.onMeasure(RelativeLayout.java:529) at android.view.View.measure(View.java:15609) - person Someone Somewhere; 12.12.2016

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

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

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

person skr1p7k1dd    schedule 15.07.2014
comment
Большой. Я обернул свой оригинальный (корневой) RelativeLayout фиктивным новым LinearLayout. Это сработало как по волшебству, после нескольких дней попыток. Кроме того, я думаю, что это ошибка в более старых версиях Android, поскольку мое устройство с леденцами работало хорошо, но устройство моего клиента 4.1.2 вызывало исключение NullPointerException. - person Diego Stiehl; 28.06.2015