我一直在关注本教程: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中显示它的图标..任何人都知道为什么??
答案 0 :(得分:3)
要不获取NPE,您的客户端代码需要:
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”教程的链接