CodeZine(コードジン)

特集ページ一覧

Google Maps APIの基本

Web APIで楽々Androidアプリ(5)

  • LINEで送る
  • このエントリーをはてなブックマークに追加
2013/10/21 14:00
目次

GoogleMapクラスの基本

 これまでの作業でようやく準備が整いました。ここからは、Google Maps Android APIのクラスを追加していきます。

Google Maps Android APIの主要クラス

 実際に追加する前に、今回利用する3つのクラスを簡単にまとめました。地図に対する操作や設定は、GoogleMapオブジェクトをアクセスすることになります。

Google Maps Android APIの主要クラス
クラス名 概要
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で追加します。ここでは、画面いっぱいに表示するように、レイアウトファイルに記述します。

activity_main.xml
<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に追加していきます。

MainActivity.xmlの一部
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メソッドを定義しましょう。地図の初期設定は、レイアウトファイルに記述することもできますが、今回は、ソースコードから動的に設定しています。

MainActivity.xmlの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で取得した情報を追加していきます。



  • LINEで送る
  • このエントリーをはてなブックマークに追加

バックナンバー

連載:Web APIで楽々Androidアプリ

もっと読む

著者プロフィール

  • WINGSプロジェクト 高江 賢(タカエ ケン)

    <WINGSプロジェクトについて> 有限会社 WINGSプロジェクトが運営する、テクニカル執筆コミュニティ(代表 山田祥寛)。主にWeb開発分野の書籍/記事執筆、翻訳、講演等を幅広く手がける。2018年11月時点での登録メンバは55名で、現在も執筆メンバを募集中。興味のある方は、どしどし応募頂...

  • 山田 祥寛(ヤマダ ヨシヒロ)

    静岡県榛原町生まれ。一橋大学経済学部卒業後、NECにてシステム企画業務に携わるが、2003年4月に念願かなってフリーライターに転身。Microsoft MVP for ASP/ASP.NET。執筆コミュニティ「WINGSプロジェクト」代表。 主な著書に「入門シリーズ(サーバサイドAjax/XM...

あなたにオススメ

All contents copyright © 2005-2021 Shoeisha Co., Ltd. All rights reserved. ver.1.5