SHOEISHA iD

※旧SEメンバーシップ会員の方は、同じ登録情報(メールアドレス&パスワード)でログインいただけます

DeveloperZine(デベロッパージン)- エンジニアの意思決定を支える技術情報メディア ProductZine

CodeZine編集部では、現場で活躍するデベロッパーをスターにするためのカンファレンス「Developers Summit」や、エンジニアの生きざまをブーストするためのイベント「Developers Boost」など、さまざまなカンファレンスを企画・運営しています。

Web APIで楽々Androidアプリ

Google Maps APIの基本

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

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

この記事は参考になりましたか?

連載通知を行うには会員登録(無料)が必要です。
既に会員の方はを行ってください。
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

※プロフィールは、執筆時点、または直近の記事の寄稿時点での内容です

この記事は参考になりましたか?

この記事をシェア

CodeZine(コードジン)
https://codezine.jp/article/detail/7440 2013/10/21 14:00

イベント

CodeZine編集部では、現場で活躍するデベロッパーをスターにするためのカンファレンス「Developers Summit」や、エンジニアの生きざまをブーストするためのイベント「Developers Boost」など、さまざまなカンファレンスを企画・運営しています。

新規会員登録無料のご案内

  • ・全ての過去記事が閲覧できます
  • ・会員限定メルマガを受信できます

メールバックナンバー