2009/05/21

Android アプリをCUIで開発してみる(Hello, MapView のつづき)

Android アプリをCUIで開発してみる(Hello, MapView) [hanagurotanuki.blogspot.com]のつづきです。

低レベルなことやってます。

チュートリアルのHello, MapView で引き続き試してみました。
Hello, MapView | Android Developers [developer.android.com]

Androidアプリの勉強というより、Javaの初歩の初歩つまずいてるって感じです。

引き続き以下の環境で試してみます。
  • SDKはAndroid 1.5 SDK, Release 1のLinux版

  • GNOME Terminal + VIM + Ant


参照したMap APIのリファレンスです。
com.google.android.maps [code.google.com]
これがなかなか見つけられなくて非常に苦労しました。
インストールしたSDKにも含まれています。


Android アプリをCUIで開発してみる(Hello, MapView) [hanagurotanuki.blogspot.com]で行なったことにつづけて、チュートリアルにある以下の追加を行ないます。
So, we now have full interaction controls. All well and good, but what we really want our map for is custom markers and layovers. Let's add some Overlay objects to our map. To do this, we're going to implement the ItemizedOverlay class, which can manage a whole set of Overlay items for us.


Javaアプリなんて作ったことない私は、クラスの追加ってとこでちょっと考え込みました。
当然ファイルを分けたいのですが、Javaでどうやってファイル分けするんだろう…とか。

C++だったらヘッダファイルをincludeだよなーとか考えたり。

そこで、以前買ったのに全然読まずにダンボール箱にしまっておいたJavaのプログラミング本を出してきました。


2001年6月1日第1版第6刷発行


…随分昔に買ったんだなぁ。


Javaのバージョンも上がっているけど、まあ参考になるだろうとちょろちょろ読みながら行いました。

なんとかビルドが通ってAndroid Dev Phone 1(ADP1)で動作させることができました。

以下は自分がVIMでMap APIのリファレンス読みながらカリカリ書いたソースです。
これの動作を確認した後、試しにEclipseでチュートリアル通りに進めて作成したソースを見たら大体同じになっていたので、ちょっと安心しました。

・HelloMapView.java (VIMで記述)
package  com.example.hellomapview;

import android.app.Activity;
import android.graphics.drawable.Drawable;
import android.os.Bundle;
import android.widget.LinearLayout;
import android.widget.ZoomControls;
import com.google.android.maps.GeoPoint;
import com.google.android.maps.MapActivity;
import com.google.android.maps.MapView;
import com.google.android.maps.Overlay;
import com.google.android.maps.OverlayItem;

import java.util.List;

public class HelloMapView extends MapActivity
{
LinearLayout linearLayout;
MapView mapView;
ZoomControls mZoom;
List mapOverlays;
Drawable drawable;
HelloItemizedOverlay itemizedOverlay;


/** Called when the activity is first created. */
@Override
public void onCreate(Bundle savedInstanceState)
{
super.onCreate(savedInstanceState);
setContentView(R.layout.main);

linearLayout = (LinearLayout) findViewById(R.id.zoomview);
mapView = (MapView) findViewById(R.id.mapview);
mZoom = (ZoomControls) mapView.getZoomControls();

linearLayout.addView(mZoom);

mapOverlays = mapView.getOverlays();
drawable =
this.getResources().getDrawable(R.drawable.androidmarker);
itemizedOverlay =
new HelloItemizedOverlay(drawable);

GeoPoint point =
new GeoPoint(19240000, -99120000);
OverlayItem overlayitem =
new OverlayItem(point, "", "");

GeoPoint point2 =
new GeoPoint(35410000, 139460000);
OverlayItem overlayitem2 =
new OverlayItem(point2, "", "");


itemizedOverlay.addOverlay(overlayitem);
itemizedOverlay.addOverlay(overlayitem2);
mapOverlays.add(itemizedOverlay);
}

@Override
protected boolean isRouteDisplayed() {
return false;
}
}


・HelloItemizedOverlay.java (VIMで記述)
package  com.example.hellomapview;

import com.google.android.maps.ItemizedOverlay;
import com.google.android.maps.OverlayItem;

import java.util.ArrayList;

public class HelloItemizedOverlay extends ItemizedOverlay
{
private ArrayList mOverlays =
new ArrayList();

HelloItemizedOverlay(android.graphics.drawable.Drawable defaultMarker)
{
super(boundCenterBottom(defaultMarker));
}

public void addOverlay(OverlayItem overlay) {
mOverlays.add(overlay);
populate();
}

@Override
protected OverlayItem createItem(int i) {
return mOverlays.get(i);
}

@Override
public int size()
{
return mOverlays.size();
}
}


size()については、チュートリアルに
We're also required to override the size() method. Replace the existing contents of the method with a size request to our ArrayList:
     return mOverlays.size();

としか書いていなくてどんな宣言にすればちょっと考えたのですが、Map APIのリファレンスのItemizedOverlayクラスのトコを見たら、
abstract  int  size()
The number of items in this overlay.

とあったので、コレに合わせました。

また、試しにEclipseでチュートリアル通りに進めてできたHelloItemizedOverlay.java見ると、
import android.graphics.drawable.Drawable;

とインポートしているのに対して、私がVIMで作成した際はMap APIリファレンスのItemizedOverlayの項目にあるコンストラクタの宣言をコピーしたため、
HelloItemizedOverlay(android.graphics.drawable.Drawable defaultMarker)
{
super(boundCenterBottom(defaultMarker));
}

としてしまいました。

いいのかな?

0 件のコメント: