现在我正在尝试设计一个 Android 应用程序,其中一个关键功能是能够点击一个区域并在那里设置一个标志。
为了自学 Google Maps API 的工作原理,我使用了开发指南中的教程:http://developer.android.com/resources/tutorials/views/hello-mapview.html
在此过程中的每一步,我都试图准确理解发生了什么。在大多数情况下,我明白了。我不明白的一件事是对上下文的引用。具体来说,在该教程的 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 对象存在的原因至关重要。
在本教程的主要(也是唯一) Activity 中,以下行似乎是与 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 map 中使用 Context?
这两个构造函数是怎么回事?
谢谢!
最佳答案
What is Context?
Context
是 Activity
(和其他类)的祖先类。它提供对资源等事物的访问。您经常需要为各种方法和构造函数提供 Context
。如果您在组件中(例如 MapActivity
),在大多数情况下使用 this
就足够了。
Why and how is Context used in this tutorial and in the Google Maps set up in general?
您的 MapActivity
继承自 Context
。
关于java - 谷歌地图教程 : What is Context?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8684073/