上下文空指针
我一直在关注这个教程: 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”教程的链接