目前我正在尝试设计一款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地图中使用上下文?
这两个构造函数有什么用?
谢谢!
答案 0 :(得分:1)
什么是上下文?
Context
是Activity
(和其他类)的祖先类。它提供对资源等内容的访问。您经常需要为各种方法和构造函数提供Context
。如果您在某个组件中(例如,MapActivity
),则在大多数情况下使用this
就足够了。
为什么以及如何在本教程和Google地图中使用上下文?
您的MapActivity
继承自Context
。
答案 1 :(得分:0)
由于多种原因,您可能需要应用程序上下文。在本教程中,您需要在用户点击ItemizedOverlay实例时创建弹出对话框。此对话框显示该项目的标题和摘要文本。