Google地图教程:什么是上下文?

时间:2011-12-30 21:03:17

标签: java android google-maps android-mapview

目前我正在尝试设计一款Android应用,其关键功能是能够点击某个区域并在那里设置标记。
为了自学Google Maps API的工作原理,我使用了开发指南中的教程:http://developer.android.com/resources/tutorials/views/hello-mapview.html

在每一步中,我试图准确理解发生了什么。在大多数情况下,我得到了它。我不明白的一件事是对Context的引用。具体来说,在该教程的HelloItemizedOverlay类中,有一行

Context mContext;

以后有两个构造函数,其中一个构造函数将Context对象作为参数,另一个构造函数不作为参数。

public HelloItemizedOverlay(Drawable defaultMarker){
        super(boundCenterBottom(defaultMarker));
}

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

Context项似乎将在稍后的onTap方法中发挥作用:

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

但是,本教程没有解释AlertDialog.Builder的工作原理 - 它只是将它抛出那里。似乎理解这个目的对理解Context对象存在的原因至关重要。

在本教程的主要(也是唯一的)活动中,以下几行似乎是与HelloItemizedOverlay类交互的行:

List<Overlay> mapOverlays = mapView.getOverlays();
Drawable drawable = this.getResources().getDrawable(R.drawable.androidmarker);
**HelloItemizedOverlay itemizedoverlay = new HelloItemizedOverlay(drawable);**

GeoPoint point = new GeoPoint(19240000, -99120000);
OverlayItem overlayitem = new OverlayItem(point, "Hello World!", "Ciudad Mexico");

itemizedoverlay.addOverlay(overlayitem);
mapOverlays.add(itemizedoverlay);

标有**的行是引用HelloItemizedOverlay类的构造函数的行。但是,该行在onTap方法中产生了NullPointerException错误,这是有道理的,因为该方法使用mContext,它永远不会给出值。在通过StackOverflow搜索之后,我发现这是教程中的一个错误,并且可以通过将行更改为

来修复它。
**HelloItemizedOverlay itemizedoverlay = new HelloItemizedOverlay(drawable, this);**

确实有效。

所以我的问题是:

什么是上下文?我无法在互联网上找到明确和适用的答案。

为什么以及如何在本教程和Google地图中使用上下文?

这两个构造函数有什么用?

谢谢!

2 个答案:

答案 0 :(得分:1)

  

什么是上下文?

ContextActivity(和其他类)的祖先类。它提供对资源等内容的访问。您经常需要为各种方法和构造函数提供Context。如果您在某个组件中(例如,MapActivity),则在大多数情况下使用this就足够了。

  

为什么以及如何在本教程和Google地图中使用上下文?

您的MapActivity继承自Context

答案 1 :(得分:0)

由于多种原因,您可能需要应用程序上下文。在本教程中,您需要在用户点击ItemizedOverlay实例时创建弹出对话框。此对话框显示该项目的标题和摘要文本。