Java 上下文空指针
我一直在学习本教程: 但是在Java 上下文空指针,java,android,google-maps,Java,Android,Google Maps,我一直在学习本教程: 但是在onTapmContext中抛出了一个NullPointerException。。有人知道为什么吗?这是我的密码 public class Mapitems extends ItemizedOverlay{ Context mContext; private ArrayList<OverlayItem> mOverlays = new ArrayList<OverlayItem>(); public Mapitems(Drawabl
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();
}
}
公共类Mapitems扩展了ItemizeOverlay{
语境;
private ArrayList mOverlays=new ArrayList();
公共地图项(可绘制的默认标记){
super(boundCenterBottom(defaultMarker));
}
公共映射项(可绘制的默认标记,上下文){
超级(默认标记);
mContext=上下文;
}
@凌驾
受保护的OverlayItem createItem(int i){
返回mOverlays.get(i);
}
公共void addOverlay(OverlayItem overlay){
添加(覆盖);
填充();
}
@凌驾
受保护的布尔onTap(整数索引){
OverlayItem item=mOverlays.get(索引);
AlertDialog.Builder dialog=新建AlertDialog.Builder(mContext);
setTitle(item.getTitle());
setMessage(item.getSnippet());
dialog.show();
返回true;
}
@凌驾
公共整数大小(){
返回mOverlays.size();
}
}
//编辑:我仍然有这个问题。赏金是给任何人谁可以给我一个解释,为什么我会得到这种错误,我该如何纠正它
//edit2:似乎过去的答案允许我单击该项目,但在地图视图中不显示其图标。。有人知道为什么吗?当您使用带有一个参数的构造函数时,没有引用集,并且方法
AlertDialog.Buidler(/*param*/)
不需要空值
在初始化类Mapitems
的对象的代码中搜索
请添加指向“本”教程的链接以不获取NPE,您的客户端代码需要:
- 仅使用2参数构造函数,即在上下文中使用的构造函数
- 使用非空的
上下文调用构造函数。如果从活动中传递
,请确保构造函数调用发生在此
方法中或更高版本中。例如,这意味着您不能直接将onCreate()
对象初始化为活动的字段Mapitems
HelloItemizedOverlay.java
中,这是:
HelloItemizedOverlay itemizedoverlay = new HelloItemizedOverlay(drawable);
真的应该是:
HelloItemizedOverlay itemizedoverlay = new HelloItemizedOverlay(drawable, this);
更改代码中的相关引用(您正在实例化
Mapitems
),它应该可以工作。查看您的代码,您可能会调用简单构造函数
public Mapitems(Drawable defaultMarker)
public Mapitems(Drawable defaultMarker, Context context)
此构造函数不设置mContext
,这就是为什么会出现NullPointerException。添加类似于
mContext=newcontext()
或mContext=android.content.getApplicationContext()
的行可能会解决此问题
也可能为另一个构造函数提供了null参数
public Mapitems(Drawable defaultMarker)
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;
}
希望这能解决您的问题。对于未显示的图像,在更改调用以正确设置上下文后
HelloItemizedOverlay itemizedoverlay = new HelloItemizedOverlay(drawable, this);
被调用的构造函数与单参数构造函数处理图像的方式不同。将2参数构造函数更改为使用boundCenterBottom包装可绘制文件现在对我很有用
public HelloItemizedOverlay(Drawable defaultMarker, Context context){
super(boundCenterBottom(defaultMarker));
mContext = context;
}
我添加了一个链接。我应该如何/在何处初始化它?再次查看此添加此允许我使其可单击,但不会在地图视图中显示图标。我能看到地图上的图标并点击它们吗?不客气。至于第二个问题,它可能是
hellogoglemaps
类中的某个东西,或者在您的版本中调用的任何东西。让舒尔在项目的res/drawable/
目录中有一个图像,并确保您正确引用该图像。您可能会有一行类似于this.getResources().getDrawable(R.drawable.[imgFileName])
的代码,其中[imgFileName]是不带扩展名(.png)的所需图像的名称