【问题标题】:Context null Pointer上下文空指针
【发布时间】:2010-08-20 14:45:12
【问题描述】:

我一直在关注这个教程: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:似乎过去的答案允许我单击该项目,但没有在地图视图中显示其图标..有人知道为什么吗??

【问题讨论】:

    标签: java android google-maps


    【解决方案1】:

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

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

    希望这能解决您的问题。

    【讨论】:

    • 不客气。至于你的第二个问题,它可能是 HelloGoogleMaps 类中的东西,或者你的版本中调用的任何东西。确保您在项目的res/drawable/ 目录中有一个图像,并且您可以正确引用它。您可能会有类似this.getResources().getDrawable(R.drawable.[imgFileName]) 这样的行,其中 [imgFileName] 是所需图像的名称,不带扩展名 (.png)
    【解决方案2】:

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

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

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

    HelloItemizedOverlay itemizedoverlay = new HelloItemizedOverlay(drawable);
    

    真的应该是:

    HelloItemizedOverlay itemizedoverlay = new HelloItemizedOverlay(drawable, this);
    

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

    【讨论】:

    • 再看一遍添加这个可以让我让它可点击但不在地图视图中显示图标。知道如何解决它吗?我可以在地图中看到图标并单击它们吗?
    【解决方案3】:

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

    HelloItemizedOverlay itemizedoverlay = new HelloItemizedOverlay(drawable, this);
    

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

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

    【讨论】:

      【解决方案4】:

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

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

      请添加“本”教程的链接

      【讨论】:

      • 我添加了一个链接。我应该如何/在哪里初始化它?
      猜你喜欢
      • 2015-11-14
      • 1970-01-01
      • 2012-02-19
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-07-30
      • 2020-05-25
      • 1970-01-01
      相关资源
      最近更新 更多