GoogleMapクラスの基本
これまでの作業でようやく準備が整いました。ここからは、Google Maps Android APIのクラスを追加していきます。
Google Maps Android APIの主要クラス
実際に追加する前に、今回利用する3つのクラスを簡単にまとめました。地図に対する操作や設定は、GoogleMapオブジェクトをアクセスすることになります。
| クラス名 | 概要 |
|---|---|
| GoogleMap |
Google Maps Android APIのメインとなるクラス。 このクラスがGoogle Mapsサービスと接続して地図を表示する。 |
| MapFragment |
地図を表示するコンテナ。 Fragmentクラスの派生クラスで、GoogleMapオブジェクトへのアクセスを仲介する。 |
| CameraPosition | 地図の中心位置を保持するクラス。 |
Fragment(断片や一部分といった意味)は、UIコンポーネントの一つで、Android 3.0から追加されました。従来は、Activity上に直接UIパーツを組み込むイメージでしたが、Fragmentを使った場合、このFragment上にUIパーツを配置する形になります。画面表示の制御をFragmentが担うことで、1つのActivityから、動的にレイアウトを変更できるようになりました。
なおFragmentは、単体で存在することはできないため、いずれかのActivityに属している必要があります。このため、ライフサイクルについても、親のActivityの影響下にあり、Activityと同様なメソッドがコールバックされます。また、UIの生成などに関わるコールバックメソッドも、いくつか追加されています。
MapFragmentの追加
地図を表示するコンテナとなるMapFragmentを、mapというIDで追加します。ここでは、画面いっぱいに表示するように、レイアウトファイルに記述します。
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
tools:context=".MainActivity" >
<fragment
android:id="@+id/map"
android:name="com.google.android.gms.maps.MapFragment"
android:layout_width="match_parent"
android:layout_height="match_parent"
/>
</RelativeLayout>
これで、ようやく地図が表示できる状態になりました。ただし、まったくのデフォルト状態なので、次に地図の初期設定を追加してみましょう。
GoogleMapオブジェクトの取得
地図を表示するためのコードを、Activityに追加していきます。
public class MainActivity extends Activity {
// マップオブジェクト(1)
private GoogleMap googleMap;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
// MapFragmentの取得(2)
MapFragment mapFragment = (MapFragment) getFragmentManager()
.findFragmentById(R.id.map);
try {
// マップオブジェクトを取得する(3)
googleMap = mapFragment.getMap();
// Activityが初めて生成されたとき(4)
if (savedInstanceState == null) {
// フラグメントを保存する(5)
mapFragment.setRetainInstance(true);
// 地図の初期設定を行う(6)
mapInit();
}
}
// GoogleMapが使用できないとき
catch (Exception e) {
}
}
}
まず、地図オブジェクトのGoogleMapクラスを利用するために、GoogleMapオブジェクトをフィールドとして追加しておきます(1)。インスタンス自体は、アプリの最初の起動時にコールバックされるonCreateメソッドのなかで取得します(3)。ただし、GoogleMapオブジェクトは、MapFragmentのなかで定義されていますので、始めにMapFragmentを取り出しています(2)。
次に、このサンプルでは、Activityが初回生成時かどうかを、onCreateメソッドの引数savedInstanceStateの値の有無で判別しています(4)。
Androidでは、端末を回転した場合、いったんアプリが終了状態になり、再度、onCreateメソッドが呼ばれます。そのため、毎回地図が初期表示の位置に戻ってしまわないように、Activityが初めて生成されたときのみ、初期設定(6)を行うようにします。
また、Fragmentクラスの状態保存機能を使って、Fragmentを復元しています。MapFragmentクラスのsetRetainInstanceメソッドの引数に、trueを指定して実行すると(5)、Fragmentが保存されるようになります。その結果、Activityの再生成時には、以前表示していた状態のオブジェクトが復元できます。
地図の初期設定
最後に、地図の設定を行うmapInitメソッドを定義しましょう。地図の初期設定は、レイアウトファイルに記述することもできますが、今回は、ソースコードから動的に設定しています。
// 地図の初期設定
private void mapInit() {
// 地図タイプ設定(1)
googleMap.setMapType(GoogleMap.MAP_TYPE_NORMAL);
// 現在位置ボタンの表示(2)
googleMap.setMyLocationEnabled(true);
// 東京駅の位置、ズーム設定(3)
CameraPosition camerapos = new CameraPosition.Builder()
.target(new LatLng(35.681382, 139.766084)).zoom(15.5f).build();
// 地図の中心を変更する(4)
googleMap.moveCamera(CameraUpdateFactory.newCameraPosition(camerapos));
}
まず地図のタイプ(1)を決め、現在位置に移動するボタンを追加します(2)。そして、最初に表示する地図の中心位置と、地図のサイズを設定しています(3、4)。
地図の中心位置を設定するには、CameraPositionクラスを利用します。CameraPositionクラスは、直接コンストラクタを呼び出すのではなく、生成用のBuilderメソッドを利用してインスタンスを生成します(3)。
なお今回のサンプルは、エミュレーターでは動作しないようです(執筆時点のエミュレーターでは、Google Play servicesのライブラリが不足しています)。その場合は、実機でお試しください。
最後に
今回は、Google Maps Android APIを使った地図アプリの基本を解説しました。次回は、このスケルトンアプリに、Web APIで取得した情報を追加していきます。
