2010-08-20 44 views
4

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

    } 

//编辑:我仍然有这个问题。赏金适用于任何能给我解释为什么我会遇到这种错误的人,我将如何纠正?

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

回答

3

看,你可能调用简单构造

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

希望这能解决你的问题。

+0

谢谢你,先生。 – Skizit 2010-08-26 00:27:42

+0

不客气。至于你的第二个问题,它可能是'HelloGoogleMaps'类中的东西,或者是你的版本中调用的任何东西。请确保您的项目的res/drawable /目录中有一个图像,并且您正确引用它。你可能会有这样一行:this.getResources()。getDrawable(R.drawable。[imgFileName])'其中[imgFileName]是没有扩展名的所需图像的名称(.png) – neXus 2010-08-26 12:06:35

0

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

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

请加入到“这个”教程

+0

我已经添加了一个链接。我应该如何/在哪里初始化它? – Skizit 2010-08-20 15:13:02

3

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

  • 使用2参数的构造函数而已,也就是说,一个了结在上下文中
  • 使用非空Context调用构造函数。如果从活动中传递this,请确保构造函数调用发生在onCreate()方法内或activity lifecycle以后。这意味着,例如,您不能直接将Mapitems对象初始化为活动的字段。

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

HelloItemizedOverlay itemizedoverlay = new HelloItemizedOverlay(drawable); 

真的应该是:

HelloItemizedOverlay itemizedoverlay = new HelloItemizedOverlay(drawable, this); 

更改代码中的相关引用(你在哪里实例化Mapitems),它应该工作。在你的代码

+0

再看一遍,添加这个让我可以点击它,但不会在地图视图中显示图标。任何想法如何修复它我可以看到地图中的图标并点击它们? – Skizit 2010-08-26 00:24:37

1

为图像不显示,后更改呼叫设置上下文正确

HelloItemizedOverlay itemizedoverlay = new HelloItemizedOverlay(drawable, this); 

被叫构造函数不以同样的方式作为单个参数的构造函数处理图像。更改2参数构造函数以包装带有boundCenterBottom的绘图现在对我来说很有用

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