Контекстный нулевой указатель - PullRequest
4 голосов
/ 20 августа 2010

Я следовал этому уроку: http://developer.android.com/resources/tutorials/views/hello-mapview.html, но в onTap mContext вызывает исключение NullPointerException ... кто-нибудь знает почему?Вот мой код ..

    public class Mapitems extends ItemizedOverlay{
Context mContext;

private ArrayList<OverlayItem> mOverlays = new ArrayList<OverlayItem>();

public Mapitems(Drawable defaultMarker) {
      super(boundCenterBottom(defaultMarker));
    }

public Mapitems(Drawable defaultMarker, Context context) {
      super(defaultMarker);
      mContext = context;
    }
@Override
protected OverlayItem createItem(int i) {
    return mOverlays.get(i);
}

public void addOverlay(OverlayItem overlay) {
    mOverlays.add(overlay);
    populate();
}

@Override
protected boolean onTap(int index) {
  OverlayItem item = mOverlays.get(index);
  AlertDialog.Builder dialog = new AlertDialog.Builder(mContext);
  dialog.setTitle(item.getTitle());
  dialog.setMessage(item.getSnippet());
  dialog.show();
  return true;
}

@Override
public int size() {
    return mOverlays.size(); 
}

  }

// edit: у меня все еще проблемы с этим.Баунти для тех, кто может дать мне объяснение, почему я получаю такую ​​ошибку и как бы я ее исправил?

// edit2: кажется, что прошлый ответ позволяет мне щелкнуть элемент, но непоказать его иконку в просмотре карты .. кто-нибудь знает, почему ??

Ответы [ 4 ]

3 голосов
/ 20 августа 2010

Чтобы не получить NPE, ваш код клиента должен будет:

  • использовать только конструктор с двумя аргументами, то есть тот, который принимает в контексте
  • вызовите конструктор с ненулевым Context. При передаче this из действия убедитесь, что вызов конструктора происходит в методе onCreate() или более позднем в жизненном цикле действия . Это означает, что вы не можете напрямую инициализировать объект Mapitems как поле деятельности, например.

Я посмотрел учебник, на который вы ссылаетесь, и действительно, они забыли сказать вам, чтобы вы вызывали конструктор с контекстом. В HelloItemizedOverlay.java это:

HelloItemizedOverlay itemizedoverlay = new HelloItemizedOverlay(drawable);

действительно должно быть:

HelloItemizedOverlay itemizedoverlay = new HelloItemizedOverlay(drawable, this);

Измените соответствующую ссылку в своем коде (где вы создаете экземпляр Mapitems), и она должна работать.

3 голосов
/ 25 августа 2010

Глядя на свой код, вы, вероятно, вызываете простой конструктор

public Mapitems(Drawable defaultMarker)

Этот конструктор не устанавливает mContext, и поэтому вы получаете исключение NullPointerException.
Добавление строки, например mContext = new Context()или mContext = android.content.getApplicationContext() может решить проблему.

Также возможно, что нулевой аргумент передается другому конструктору

public Mapitems(Drawable defaultMarker, Context context)

Вставка нулевой проверки при присваивании mContext и при необходимости предоставленияконтекст по умолчанию может решить проблему.

Конструкторы будут выглядеть так:

public Mapitems(Drawable defaultMarker) {
    super(boundCenterBottom(defaultMarker));
    mContext = android.content.getApplicationContext();
    // or: mContext = new Context();
}

public Mapitems(Drawable defaultMarker, Context context) {
    super(defaultMarker);
    if(context==null)
        mContext = android.content.getApplicationContext();
        // or: mContext = new Context();
    mContext = context;
}

Надеюсь, это решит вашу проблему.

1 голос
/ 28 октября 2010

, если изображение не отображается, после изменения вызова для правильной установки контекста

HelloItemizedOverlay itemizedoverlay = new HelloItemizedOverlay(drawable, this);

вызываемый конструктор не обрабатывает изображение так же, как конструктор с одним параметром. Изменение конструктора с 2 параметрами для переноса рисованного объекта с помощью boundCenterBottom теперь работает для меня

    public HelloItemizedOverlay(Drawable defaultMarker, Context context){
    super(boundCenterBottom(defaultMarker));
    mContext = context;
}
0 голосов
/ 20 августа 2010

При использовании конструктора с одним параметром ссылка не устанавливается, и метод AlertDialog.Buidler(/*param*/) не должен иметь нулевое значение.

Поиск в вашем коде, где Вы инициализируете объект класса Mapitems.

Пожалуйста, добавьте ссылку на этот "учебник"

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...