上下文空指针

时间:2010-08-20 14:45:13

标签: java android google-maps

我一直在关注本教程: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(); 
}

  }

//编辑:我仍然遇到这个问题。 Bounty适合任何能够解释为什么我会遇到这种错误以及如何纠正错误的人?

// edit2:似乎过去的答案允许我点击该项目,但没有在mapview中显示它的图标..任何人都知道为什么??

4 个答案:

答案 0 :(得分:3)

获取NPE,您的客户端代码需要:

  • 仅使用2参数构造函数,即参与Context
  • 的构造函数
  • 使用非null Context调用构造函数。如果从活动传递this,请确保构造函数调用发生在onCreate()方法中或稍后的activity lifecycle中。这意味着您无法直接将Mapitems对象初始化为活动字段,例如。

我看了一下你引用的教程,实际上他们忘了告诉你用上下文调用构造函数。在HelloItemizedOverlay.java中,这个:

HelloItemizedOverlay itemizedoverlay = new HelloItemizedOverlay(drawable);

真的应该是:

HelloItemizedOverlay itemizedoverlay = new HelloItemizedOverlay(drawable, this);

更改代码中的相关引用(您实例化Mapitems的位置),它应该可以正常工作。

答案 1 :(得分:3)

查看代码,您可能会调用简单的构造函数

public Mapitems(Drawable defaultMarker)

此构造函数未设置mContext,这就是您获得NullPointerException的原因。 添加mContext = new Context()mContext = android.content.getApplicationContext()这样的行可能会解决问题。

也可能将null参数提供给其他构造函数

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;
}

希望这能解决你的问题。

答案 2 :(得分:1)

在更改调用以正确设置上下文后,图像未显示

HelloItemizedOverlay itemizedoverlay = new HelloItemizedOverlay(drawable, this);

被调用的构造函数不会以与单个参数构造函数相同的方式处理图像。更改2参数构造函数以使用boundCenterBottom包装drawable现在对我有用

    public HelloItemizedOverlay(Drawable defaultMarker, Context context){
    super(boundCenterBottom(defaultMarker));
    mContext = context;
}

答案 3 :(得分:0)

当您使用带有一个参数的构造函数时,没有引用集,并且方法AlertDialog.Buidler(/*param*/)不需要null值。

在您的代码中搜索初始化类Mapitems的对象的位置。

请添加“this”教程的链接