環境
- mac
前回の続きです。
前回で準備ができたので実装を開始します。
画面となるMainActivityを以下のようにします。
MainActivity.javapublic class MainActivity extends Activity { private static final String TAG_MAP_FRAGMENT = "MAP_FRAGMENT"; private MapFragment mMapFragment; private GoogleMap mGoogleMap; @SuppressLint("NewApi") @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); // MapFragmentオブジェクトを取得 this.mMapFragment = (MapFragment) getFragmentManager() .findFragmentById(R.id.map); if (this.mMapFragment == null) { // MapFragment がなければ作成する this.mMapFragment = MapFragment.newInstance(); getFragmentManager().beginTransaction() .add(android.R.id.content, mMapFragment, TAG_MAP_FRAGMENT) .commit(); } } @Override protected void onResume() { super.onResume(); if (mGoogleMap == null) { this.mGoogleMap = this.mMapFragment.getMap(); if (this.mGoogleMap != null) { mapInit(); } else { // GoogleMapが使用不可のとき } } } // 地図の初期設定メソッド private void mapInit() { // 地図タイプ設定 this.mGoogleMap.setMapType(GoogleMap.MAP_TYPE_HYBRID); } @Override public boolean onCreateOptionsMenu(Menu menu) { // Inflate the menu; this adds items to the action bar if it is present. getMenuInflater().inflate(R.menu.main, menu); return true; } @Override public boolean onOptionsItemSelected(MenuItem item) { // Handle action bar item clicks here. The action bar will // automatically handle clicks on the Home/Up button, so long // as you specify a parent activity in AndroidManifest.xml. int id = item.getItemId(); if (id == R.id.action_settings) { return true; } return super.onOptionsItemSelected(item); } }
色々なサンプルを参考にしたのですが、onResume()内で処理をするのが正式な作法のようです。Effective androidにも同じことが記載されていました。
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" android:paddingLeft="@dimen/activity_horizontal_margin" android:paddingRight="@dimen/activity_horizontal_margin" android:paddingTop="@dimen/activity_vertical_margin" android:paddingBottom="@dimen/activity_vertical_margin" tools:context="com.example.mapapplication.app.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>
上記をビルドして実機で動かします。この時注意して欲しいのは、エミュレーターだと動作しないので、実機で動かす必要があることです。
起動すると、私の環境ではAuthorization failure.が発生しました。原因はgoogle play servicesが存在しないのが原因なのでinstallします。
再びビルドして起動します。見事動作しました。
せっかくなので、東京駅の位置を指定する実装を行ってみます
public class MainActivity extends Activity { private static final LatLng TOKYO_STATION = new LatLng(35.681588,139.76608); //東京駅の緯度経度 private static final String TAG_MAP_FRAGMENT = "MAP_FRAGMENT"; private MapFragment mMapFragment; private GoogleMap mGoogleMap; @SuppressLint("NewApi") @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); // MapFragmentオブジェクトを取得 this.mMapFragment = (MapFragment) getFragmentManager() .findFragmentById(R.id.map); if (this.mMapFragment == null) { // MapFragment がなければ作成する this.mMapFragment = MapFragment.newInstance(); getFragmentManager().beginTransaction() .add(android.R.id.content, mMapFragment, TAG_MAP_FRAGMENT) .commit(); } } @Override protected void onResume() { super.onResume(); if (mGoogleMap == null) { this.mGoogleMap = this.mMapFragment.getMap(); if (this.mGoogleMap != null) { // MapFragmentのオブジェクトをセット //this.mMapFragment.setRetainInstance(true); mapInit(); } else { // GoogleMapが使用不可のとき } } } // 地図の初期設定メソッド private void mapInit() { // 地図タイプ設定 this.mGoogleMap.setMapType(GoogleMap.MAP_TYPE_HYBRID); // 地図へのマーカーの追加 MarkerOptions mo1 = new MarkerOptions(); mo1.position(TOKYO_STATION); mo1.title("東京駅"); Marker tokyost = this.mGoogleMap.addMarker(mo1); this.mGoogleMap.moveCamera(CameraUpdateFactory.newLatLngZoom(TOKYO_STATION, 15)); this.mGoogleMap.animateCamera(CameraUpdateFactory.zoomTo(10), 2000, null); } @Override public boolean onCreateOptionsMenu(Menu menu) { // Inflate the menu; this adds items to the action bar if it is present. getMenuInflater().inflate(R.menu.main, menu); return true; } @Override public boolean onOptionsItemSelected(MenuItem item) { // Handle action bar item clicks here. The action bar will // automatically handle clicks on the Home/Up button, so long // as you specify a parent activity in AndroidManifest.xml. int id = item.getItemId(); if (id == R.id.action_settings) { return true; } return super.onOptionsItemSelected(item); } }
再びビルドして起動します。見事動作しました。
とりあえず今回はここまです。起動さえできれば色々な実装が行えると思います。androidらしい楽しいアプリを作ってみましょう。でわ。
下の本を買いました。android本買うの久々です。
参考サイト
- Google Maps Android API v2 を利用して地図を表示する
- MapFragment に現在地表示、マーカー表示などの機能を追加する
- MapFragmentをTabの要素として表示したい
0 件のコメント:
コメントを投稿