上下文空指针

我一直在关注这个教程: http : //developer.android.com/resources/tutorials/views/hello-mapview.html但在onTap mContext中抛出一个NullPointerException ..有谁知道为什么? 这是我的代码..

  public class Mapitems extends ItemizedOverlay{ Context mContext; private ArrayList mOverlays = new ArrayList(); 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中显示其图标..任何人都知道为什么?

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

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

希望这能解决你的问题。

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

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

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

 HelloItemizedOverlay itemizedoverlay = new HelloItemizedOverlay(drawable); 

真的应该是:

 HelloItemizedOverlay itemizedoverlay = new HelloItemizedOverlay(drawable, this); 

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

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

 HelloItemizedOverlay itemizedoverlay = new HelloItemizedOverlay(drawable, this); 

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

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

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

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

请添加“this”教程的链接