最近の更新

2013年5月10日金曜日

GoogleMapV2MarkerInfoWindowAdapterButtonEventNG

【目的】
AndroidでGoogleMapのマーカーの情報ウィンドウをカスタマイズしボタンを配置し、イベントを追加します。(失敗しました)
※API12より前で、SupportMapFragmentを使用するバージョン。



【準備】
1.「Google Play services SDKをワークスペースにインポートする方法」で「Google Play services SDK」をワークスペースにインポートしておきます。
2.「Google APIsのGoogle Maps Android API v2のAPIキーを取得する方法」の手順で、「Google Maps Android API v2」のAPIキーを取得しておきます。
※APIキーの取得に指定するパッケージ名は「com.example.androidsample34_012」です。



【手順1】
1.「Androidプロジェクトの作成・実行方法(バージョン別一覧)」のAndroidプロジェクトの作成手順で、「AndroidSample34-012-GoogleMapV2MarkerInfoWindowAdapterButtonEventNG」といプロジェクトを作成。
※プロジェクトの設定は以下の通り。
※他の項目は任意。
項目名 項目に設定する値
アプリケーション名(Application Name) com.example.androidsample34_012
プロジェクト名(Project Name) AndroidSample34-012-GoogleMapV2MarkerInfoWindowAdapterButtonEventNG
パッケージ名(Package Name) com.example.androidsample34_012
Build SDK API 8
Minimum Required SDK API 8



【手順2】
1.「AndroidManifest.xml」は以下の通り。
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
    package="com.example.androidsample34_012"
    android:versionCode="1"
    android:versionName="1.0" >

    <uses-sdk
        android:minSdkVersion="8"
        android:targetSdkVersion="8" />

    <permission
        android:name="com.example.androidsample34_012.permission.MAPS_RECEIVE"
        android:protectionLevel="signature" />

    <uses-permission android:name="com.example.androidsample34_012.permission.MAPS_RECEIVE" />
    <uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />
    <uses-permission android:name="android.permission.INTERNET" />
    <uses-permission android:name="com.google.android.providers.gsf.permission.READ_GSERVICES" />
    <!-- External storage for caching. -->
    <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
    <!-- My Location -->
    <uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION" />
    <uses-permission android:name="android.permission.ACCESS_FINE_LOCATION" />
    <!-- Maps API needs OpenGL ES 2.0. -->
    <uses-feature
        android:glEsVersion="0x00020000"
        android:required="true" />

    <application
        android:icon="@drawable/ic_launcher"
        android:label="@string/app_name"
        android:theme="@style/AppTheme" >
        <meta-data
            android:name="com.google.android.maps.v2.API_KEY"
            android:value="YOUR_OWN_KEY" />

        <activity
            android:name="com.example.androidsample34_012.MainActivity"
            android:label="@string/title_activity_main" >
            <intent-filter>
                <action android:name="android.intent.action.MAIN" />

                <category android:name="android.intent.category.LAUNCHER" />
            </intent-filter>
        </activity>
    </application>

</manifest>
2.「YOUR_OWN_KEY」を【準備】で取得しておいた、APIキーに変更。
3.「Ctrl+Shift+F」を押し、コードをフォーマッティング。
4.「Ctrl+S」を押し、ファイルを保存。



【手順3】
1.「res/layout/activity_main.xml」は以下の通り。
<fragment xmlns:android="http://schemas.android.com/apk/res/android"
    android:id="@+id/map"
    android:name="com.google.android.gms.maps.SupportMapFragment"
    android:layout_width="match_parent"
    android:layout_height="match_parent" />
2.「Ctrl+Shift+F」を押し、コードをフォーマッティング。
3.「Ctrl+S」を押し、ファイルを保存。



【手順4】
1.「任意のファイルの作成方法」の手順で「res/layout/info_window_main.xml」を作成。
2.「res/layout/info_window_main.xml」は以下の通り。
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:background="@drawable/nine_patch_sample2"
    android:orientation="vertical" >

    <TextView
        android:id="@+id/title"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_gravity="center_horizontal"
        android:textSize="16sp" />

    <ImageView
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:src="@drawable/ic_launcher" >
    </ImageView>

    <TextView
        android:id="@+id/snippet"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:textColor="#333333"
        android:textSize="12sp" />

    <Button
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:onClick="onClickButton"
        android:text="ボタン" />

</LinearLayout>
2.「Ctrl+Shift+F」を押し、コードをフォーマッティング。
3.「Ctrl+S」を押し、ファイルを保存。



【手順5】
1.「任意のディレクトリの作成方法」の手順で「res/drawable」ディレクトリを作成。
2.「画像」を「res/drawable」に「nine_patch_sample2.9.png」という名前で保存。



【手順6】
1.「src/com/example/androidsample34_012/MainActivity.java」は以下の通り。
package com.example.androidsample34_012;

import android.os.Bundle;
import android.support.v4.app.FragmentActivity;
import android.view.View;
import android.widget.TextView;
import android.widget.Toast;

import com.google.android.gms.maps.GoogleMap;
import com.google.android.gms.maps.GoogleMap.InfoWindowAdapter;
import com.google.android.gms.maps.SupportMapFragment;
import com.google.android.gms.maps.model.LatLng;
import com.google.android.gms.maps.model.Marker;
import com.google.android.gms.maps.model.MarkerOptions;

public class MainActivity extends FragmentActivity {
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        initMap();
    }

    private void initMap() {
        GoogleMap googleMap = ((SupportMapFragment) getSupportFragmentManager().findFragmentById(R.id.map)).getMap();
        googleMap.addMarker(new MarkerOptions().position(new LatLng(0, 0))
                                               .title("マーカー")
                                               .snippet("この地点の情報です。\nInfoWindowAdapterを使用すると複数行に表示可能です。"));
        googleMap.setInfoWindowAdapter(new CustomInfoWindowAdapter());
    }

    class CustomInfoWindowAdapter implements InfoWindowAdapter {
        private final View infoWindow;

        CustomInfoWindowAdapter() {
            infoWindow = getLayoutInflater().inflate(R.layout.info_window_main, null);
        }

        public View getInfoWindow(Marker marker) {
            String title = marker.getTitle();
            TextView textViewTitle = (TextView) infoWindow.findViewById(R.id.title);
            textViewTitle.setText(title);

            String snippet = marker.getSnippet();
            TextView textViewSnippet = (TextView) infoWindow.findViewById(R.id.snippet);
            textViewSnippet.setText(snippet);

            return infoWindow;
        }

        public View getInfoContents(Marker marker) {
            return null;
        }
    }

    public void onClickButton(View view) {
        Toast.makeText(this, "text", Toast.LENGTH_SHORT).show();
    }
}
2.「Ctrl+Shift+F」を押し、コードをフォーマッティング。
3.「Ctrl+S」を押し、ファイルを保存。



【手順7】
1.「Androidプロジェクトの作成・実行方法(バージョン別一覧)」のAndroidプロジェクトの実行手順で、実行。
※エミュレーターでは「Google Play services SDK」が上手く動かないみたいで、実機で実行する必要があるみたいです。



【手順8】
1.以下の様に表示されますが、ボタンに対するイベントは動作しません。

































































【結論】
Info windows」に記載してある以下の通り、InfoWindowは普通のViewとして表示されるのではなく、画像として描画されるので、イベントはInfoWindowsに対するクリックイベントのみ動作するとのこと。
Note: The info window that is drawn is not a live view. The view is rendered as an image (using `View.draw(Canvas)`) at the time it is returned. This means that any subsequent changes to the view will not be reflected by the info window on the map. To update the info window later (e.g., after an image has loaded), call `showInfoWindow()`. Furthermore, the info window will not respect any of the interactivity typical for a normal view such as touch or gesture events. However you can listen to a generic click event on the whole info window as described in the section below.



以上です。

0 件のコメント:

コメントを投稿

注: コメントを投稿できるのは、このブログのメンバーだけです。

関連記事