3

マップを表示する 1 つのアクティビティと、マップ上にマーカーまたはオーバーレイ アイテムを配置するために使用される別のクラスを含むアプリがあります。今のところうまく機能しますが、ユーザーが地図に触れると、新しい場所を含むメッセージが表示されます (このコードは AddItemizedOverlay の ontouche イベントに実装されています)。

代わりに、マップ上のピンを新しい場所に変更したいと思います (メイン アクティビティのコード)。AddItemizedOverlay クラスからメイン アクティビティに新しい位置データを渡すにはどうすればよいですか? 新しいユーザーの場所を描画するにはどうすればよいですか? ありがとう!!!

myMapactivity.java

public class myMapactivity extends MapActivity 
{

private MapView mapView;
private MapController mapCtrl;
List<Overlay> mapOverlays;
GeoPoint mePoint;

AddItemizedOverlay itemizedOverlay;
OverlayItem overlayitem;

    public void onCreate(Bundle savedInstanceState)
    {
        ...

       mapView = (MapView) findViewById(R.id.mapview);
   mapView.setSatellite(false);
   mapView.setBuiltInZoomControls(true);

   mapOverlays = mapView.getOverlays();
   mapOverlays.clear();
   mapCtrl = mapView.getController();

       drawCurrentUserLocation();
     }

     private void drawCurrentUserLocation()
{

   // Drawable marker icon
   Drawable drawable_user = this.getResources()
            .getDrawable(R.drawable.mark_red);

   itemizedOverlay = new AddItemizedOverlay(drawable_user, this);

   overlayitem = new OverlayItem(mePoint, "Your Location","That is you!");

   itemizedOverlay.addOverlay(overlayitem);

   mapOverlays.add(itemizedOverlay);
   itemizedOverlay.populateNow();
   mapCtrl.animateTo(mePoint);
   mapCtrl.setZoom(17);
}
}

AddItemizedOverlay.java

   public class AddItemizedOverlay extends ItemizedOverlay<OverlayItem> {

   private ArrayList<OverlayItem> mapOverlays = new ArrayList<OverlayItem>();

   private Context context;

   public AddItemizedOverlay(Drawable defaultMarker) {
        super(boundCenterBottom(defaultMarker));
   }

   public AddItemizedOverlay(Drawable defaultMarker, Context context) {
        this(defaultMarker);
        this.context = context;
   }

   @Override
   public boolean onTouchEvent(MotionEvent event, MapView mapView)
   {   

       if (event.getAction() == 1) {
           GeoPoint geopoint = mapView.getProjection().fromPixels(
               (int) event.getX(),
               (int) event.getY());
           // latitude
           double lat = geopoint.getLatitudeE6() / 1E6;
           // longitude
           double lon = geopoint.getLongitudeE6() / 1E6;

           Geocoder geocoder = new Geocoder(context, Locale.getDefault());   
           String result = null;
           try {
               List<Address> list = geocoder.getFromLocation(lat, lon, 1);
               if (list != null && list.size() > 0) {
                   Address address = list.get(0);
                   // sending back first address line and locality
                   result = address.getAddressLine(0) + ", " + address.getLocality();
                   Toast.makeText(context, result, Toast.LENGTH_SHORT).show();
               }
           } catch (IOException e) {
               Log.e("Error", "Impossible to connect to Geocoder", e);
           } 

       }
       return false;
   } 
4

1 に答える 1

0

myMapactivity は AddItemizedOverlay のコンテキストであるため、以下を使用できます。

((myMapactivity)context).setMarker(event)AddItemizedOverlay で。これは、myMapactivity に実装する必要がある public メソッド setMarker(MotionEvent event) を呼び出します。

于 2012-10-13T21:58:12.837 に答える