情報ウィンドウ

情報ウィンドウは、地図の上でテキストや画像を表示するポップアップ ウィンドウです。情報ウィンドウは、常にマーカーに固定されます。デフォルトの動作では、マーカーがタップされたときに表示されます。

コードサンプル

GitHub の ApiDemos リポジトリには、すべての情報ウィンドウの機能を示すサンプルが含まれています。

  • MarkerDemoActivity: 情報ウィンドウのカスタマイズと情報ウィンドウ リスナーの使用

はじめに

情報ウィンドウでは、マーカーをタップしたユーザーに情報を表示することができます。情報ウィンドウは一度に 1 つのみ表示されます。ユーザーがマーカーをタップすると、現在の情報ウィンドウが閉じて、新しい情報ウィンドウが表示されます。なお、ユーザーが現在情報ウィンドウが表示されているマーカーをタップすると、その情報ウィンドウが閉じて再度開きます。

情報ウィンドウは、関連付けられているマーカーの真上に、デバイスの画面の向きに合わせて表示されます。デフォルトの情報ウィンドウでは、太字のタイトルと、タイトルの下にスニペット テキスト(省略可)が表示されます。

情報ウィンドウを追加する

情報ウィンドウを追加するには、対応するマーカーの title() メソッドと snippet() メソッドを設定する方法が最も簡単です。これらのプロパティを設定すると、マーカーがタップされるたびに情報ウィンドウが表示されるようになります。

static final LatLng MELBOURNE = new LatLng(-37.81319, 144.96298);
Marker melbourne = mMap.addMarker(new MarkerOptions()
                          .position(MELBOURNE)
                          .title("Melbourne")
                          .snippet("Population: 4,137,400"));

情報ウィンドウを表示または非表示にする

情報ウィンドウはユーザーのタッチイベントに応答するように設計されています。必要に応じて情報ウィンドウをプログラムで表示するには、ターゲット マーカーで showInfoWindow() を呼び出します。情報ウィンドウを非表示にするには、hideInfoWindow() を呼び出します。

static final LatLng MELBOURNE = new LatLng(-37.81319, 144.96298);
Marker melbourne = mMap.addMarker(new MarkerOptions()
                          .position(MELBOURNE)
                          .title("Melbourne"));
melbourne.showInfoWindow();

クラスタ化した個別のマーカー用の情報ウィンドウを作成することもできます。 クラスタ化した個別のマーカー用の情報ウィンドウの追加に関するガイドをご覧ください。

カスタム情報ウィンドウ

情報ウィンドウのコンテンツとデザインをカスタマイズすることもできます。 それには、InfoWindowAdapter インターフェースの具体的な実装を作成し、その実装を使用して GoogleMap.setInfoWindowAdapter() を呼び出す必要があります。このインターフェースには、実装するための 2 つのメソッド(getInfoWindow(Marker)getInfoContents(Marker))が含まれています。API では最初に getInfoWindow(Marker) を呼び出し、null が返されると getInfoContents(Marker) を呼び出します。null も返された場合は、デフォルトの情報ウィンドウが使用されます。

最初のメソッド(getInfoWindow())では、情報ウィンドウ全体で使用されるビューを指定できます。2 つ目のメソッド(getInfoContents())では、ウィンドウのコンテンツをカスタマイズすることができますが、デフォルトの情報ウィンドウのフレームと背景を保持することもできます。

デフォルトの情報ウィンドウ、カスタマイズされたコンテンツを表示している情報ウィンドウ、フレームと背景がカスタマイズされている情報ウィンドウの画像を、以下に示します。

情報ウィンドウの比較

情報ウィンドウのイベント

MarkerDemoActivity サンプルには、情報ウィンドウ イベントの登録および処理を行うサンプルコードが含まれています。

情報ウィンドウでクリック イベントをリッスンするには、OnInfoWindowClickListener を使用します。このリスナーを地図に設定するには、GoogleMap.setOnInfoWindowClickListener(OnInfoWindowClickListener) を呼び出します。ユーザーが情報ウィンドウをクリックすると、onInfoWindowClick(Marker) が呼び出され、情報ウィンドウがデフォルトのハイライト色(グレー)でハイライト表示されます。

public class MarkerDemoActivity extends AppCompatActivity implements
        OnInfoWindowClickListener,
        OnMapReadyCallback {

    private GoogleMap mMap;

    @Override
    public void onMapReady(GoogleMap map) {
        mMap = map;
        // Add markers to the map and do other map setup.
        ...
        // Set a listener for info window events.
        mMap.setOnInfoWindowClickListener(this);
    }

    @Override
    public void onInfoWindowClick(Marker marker) {
        Toast.makeText(this, "Info window clicked",
                Toast.LENGTH_SHORT).show();
    }
}

同様に、OnInfoWindowLongClickListener を使用して長押しクリック イベントをリッスンすることもできます。これは GoogleMap.setOnInfoWindowLongClickListener(OnInfoWindowLongClickListener) を呼び出して設定します。 このリスナーは、クリック リスナーと同様に動作し、長押しクリック イベントが発生すると onInfoWindowLongClick(Marker) コールバックで通知されます。

情報ウィンドウが閉じたときに通知されるようにするには、OnInfoWindowCloseListener を使用します。これは GoogleMap.setOnInfoWindowCloseListener(OnInfoWindowCloseListener) を呼び出して設定でき、これにより、onInfoWindowClose(Marker) コールバックが届くようになります。

情報ウィンドウの更新に関する注意: ユーザーが、すでに情報ウィンドウを開いているマーカーをタップして情報ウィンドウを更新した場合は、onInfoWindowClose() イベントが発生します。ただし、開いている情報ウィンドウで、Marker.showInfoWindow() をプログラムで呼び出した場合は、onInfoWindowClose() イベントは発生しません。この呼び出しは、情報ウィンドウをいったん閉じて開く場合を想定しているためです。

前のセクションで説明したように、情報ウィンドウはライブビューではありません。代わりに、ビューは地図に画像としてレンダリングされます。そのため、ビューにリスナーを設定しても無視され、ビューのどこでクリック イベントが発生したかを区別することはできません。カスタム情報ウィンドウ内には、インタラクティブなコンポーネント(ボタン、チェックボックス、テキスト入力など)を配置しないようにしてください。