ダウンロード サンプルファイル (2.0 MB)
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で取得した情報を追加していきます。
この記事は参考になりましたか?
既に会員の方はを行ってください。
- Web APIで楽々Androidアプリ連載記事一覧
- この記事の著者
-
山田 祥寛(ヤマダ ヨシヒロ)
静岡県榛原町生まれ。一橋大学経済学部卒業後、NECにてシステム企画業務に携わるが、2003年4月に念願かなってフリーライターに転身。Microsoft MVP for Visual Studio and Development Technologies。執筆コミュニティ「WINGSプロジェクト」代表。主な著書に「独習シリーズ(Java・C#・Python・PHP・Ruby・JSP&サーブレットなど)」「速習シリーズ(ASP.NET Core・Vue.js・React・TypeScript・ECMAScript、Laravelなど)」「改訂3版JavaScript本格入門」「これからはじめるLaravel実践入門」「はじめてのAndroidアプリ開発 Kotlin編 」他、著書多数。
※プロフィールは、執筆時点、または直近の記事の寄稿時点での内容です
-
WINGSプロジェクト 高江 賢(タカエ ケン)
<WINGSプロジェクトについて>有限会社 WINGSプロジェクトが運営する、テクニカル執筆コミュニティ(代表 山田祥寛)。主にWeb開発分野の書籍/記事執筆、翻訳、講演等を幅広く手がける。 2026年時点での登録メンバは約50名で、現在も執筆メンバを募集中。興味のある方は、どしどし応募頂きたい。著書、記事多数。 RSS X: @WingsPro_info(公式)、@WingsPro_info/wings(メンバーリスト) Facebook
※プロフィールは、執筆時点、または直近の記事の寄稿時点での内容です
この記事は参考になりましたか?
この記事をシェア
