2011-05-20 148 views
3

在我的Android应用程序中,我想在地图上标记一个位置(我知道位置的地址)。当我在地图上标记它时,我也想显示位置的名称。我怎样才能做到这一点?在地图上标记位置的名称?

我有这个:OverlayItem(p,“Kaufland”,“魔法王国”),但在地图上只显示点,没有名称。

这里是我的代码:

package com.ShoppingList.Shops; 


import java.io.IOException; 
import java.util.List; 
import java.util.Locale; 

import com.ShoppingList.R; 
import com.google.android.maps.GeoPoint; 
import com.google.android.maps.MapActivity; 
import com.google.android.maps.MapController; 
import com.google.android.maps.MapView; 

import java.util.ArrayList; 
import android.graphics.Canvas; 
import android.graphics.drawable.Drawable; 
import android.location.Address; 
import android.location.Geocoder; 
import android.os.Bundle; 
import com.google.android.maps.ItemizedOverlay; 
import com.google.android.maps.OverlayItem; 

public class ShowMap extends MapActivity { 
    private MapView mapView; 
    MapController mc; 

    @Override 
    protected void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     setContentView(R.layout.showmap); 

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

     Drawable marker=getResources().getDrawable(R.drawable.pushpin); 
     marker.setBounds(0, 0, marker.getIntrinsicWidth(), 
     marker.getIntrinsicHeight()); 

     InterestingLocations funPlaces = new InterestingLocations(marker); 
     mapView.getOverlays().add(funPlaces); 
     GeoPoint pt = funPlaces.getCenter(); // get the first-ranked point 
     mapView.getController().setCenter(pt); 
     mapView.getController().setZoom(15); 

    } 
    @Override 
    protected boolean isLocationDisplayed() { 
    return false; 
    } 
    @Override 
    protected boolean isRouteDisplayed() { 
    return false; 
    } 
    class InterestingLocations extends ItemizedOverlay { 
     private List locations = new ArrayList(); 
     private Drawable marker; 
     String adresa; 
     public InterestingLocations(Drawable marker) 
     { 
     super(marker); 
     this.marker=marker; 
     // create locations of interest 
     Bundle bundle = getIntent().getExtras(); 
     adresa = bundle.getString("adress"); 

     Geocoder geoCoder = new Geocoder(ShowMap.this, Locale.getDefault()); 
     try { 
     List addresses = geoCoder.getFromLocationName(adresa, 5); 
      String add = ""; 
      if (addresses.size() > 0) { 
       GeoPoint p = new GeoPoint((int) (addresses.get(0).getLatitude() * 1E6), 
         (int) (addresses.get(0).getLongitude() * 1E6)); 

       locations.add(new OverlayItem(p ,"Kaufland", "Magic Kingdom")); 

      } 
     } catch (IOException e) { 
      e.printStackTrace(); 
     } 
     populate(); 
    } 
    @Override 
    public void draw(Canvas canvas, MapView mapView, boolean shadow) { 
    super.draw(canvas, mapView, shadow); 
    boundCenterBottom(marker); 
    } 
    @Override 
    protected OverlayItem createItem(int i) { 
    return locations.get(i); 
    } 
    @Override 
    public int size() { 
    return locations.size(); 
    } 
    } 
}

回答

2

我用吐司显示由标志指示的文本。下面是我如何解决它的演示项目:

- 开始Location.java -

package com.cb2enterprises.geocode; 

import com.google.android.maps.GeoPoint; 

public class Location 
{ 
public GeoPoint Point; 
public String Title; 
public String Snippet; 

public Location(GeoPoint point, String title, String snippet) 
{ 
    Point = point; 
    Title = title; 
    Snippet = snippet; 
} 
} 

- 结束 -

- 开始PushpinOverlay.java -

package com.cb2enterprises.geocode; 

import android.content.Context; 
import android.graphics.drawable.Drawable; 
import android.widget.Toast; 
import android.view.Gravity; 
import com.google.android.maps.ItemizedOverlay; 
import com.google.android.maps.OverlayItem; 
import java.util.ArrayList; 
import java.util.List; 


public class PushpinOverlay extends ItemizedOverlay<OverlayItem> 
{ 
    private List<Location> mItems; 
    Context mContext = null; 

    public PushpinOverlay(Context context, Drawable marker) 
{ 
    super(boundCenterBottom(marker)); 
    mContext = context; 
} 

public void setItems(ArrayList<Location> items) 
{ 
    mItems = items; 
    populate(); 
} 

@Override 
protected OverlayItem createItem(int i) 
{ 
    return new OverlayItem(mItems.get(i).Point, mItems.get(i).Title, mItems.get(i).Snippet); 
} 

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

@Override 
protected boolean onTap(int i) 
{ 
    Toast msg = Toast.makeText(mContext, mItems.get(i).Title, Toast.LENGTH_LONG); 
    msg.setGravity(Gravity.CENTER, msg.getXOffset()/2, msg.getYOffset()/2); 
    msg.show(); 
    return true; 
} 
} 

- 结束 -

- 开始GeoCodeDemoActivity.java -

package com.cb2enterprises.geocode; 

import java.io.IOException; 
import java.util.ArrayList; 
import java.util.List; 
import android.app.AlertDialog; 
import android.app.Dialog; 
import android.app.ProgressDialog; 
import android.graphics.drawable.Drawable; 
import android.location.Address; 
import android.location.Geocoder; 
import android.os.Bundle; 
import android.os.Handler; 
import android.os.Message; 
import android.view.View; 
import android.view.View.OnClickListener; 
import android.widget.Button; 
import android.widget.EditText; 
import com.google.android.maps.GeoPoint; 
import com.google.android.maps.MapActivity; 
import com.google.android.maps.MapView; 
import com.google.android.maps.MyLocationOverlay; 

public class GeoCodeDemoActivity extends MapActivity 
{ 
    Geocoder geocoder = null; 
    MapView mapView = null; 
    ProgressDialog progDialog = null; 
    List<Address> addressList = null; 
    MyLocationOverlay curLocOverlay = null; 
    ArrayList<Location> locations = null; 
    PushpinOverlay pushpin = null; 

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

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

@Override 
public void onCreate(Bundle savedInstanceState) 
{ 
    super.onCreate(savedInstanceState); 
    setContentView(R.layout.main); 
    mapView = (MapView)findViewById(R.id.geoMap); 
    mapView.setBuiltInZoomControls(true); 

    locations = new ArrayList<Location>(); 

    Drawable icon = getResources().getDrawable(R.drawable.pin); 
    pushpin = new PushpinOverlay(this, icon); 

    // put the current location as hockey puck 
    curLocOverlay = new MyLocationOverlay(this, mapView); 
    curLocOverlay.runOnFirstFix(new Runnable() 
    { 
     public void run() 
     { 
      mapView.getController().animateTo(curLocOverlay.getMyLocation()); 
     } 
    }); 
    mapView.getOverlays().add(curLocOverlay); 
    mapView.getController().setZoom(12); 

    Button geoBtn = (Button)findViewById(R.id.geocodeBtn); 

    geocoder = new Geocoder(this); 
    geoBtn.setOnClickListener(new OnClickListener() 
    { 
     @Override 
     public void onClick(View arg0) 
     { 
      EditText loc = (EditText)findViewById(R.id.location); 
      String locationName = loc.getText().toString(); 
      progDialog = ProgressDialog.show(GeoCodeDemoActivity.this, "Processing", 
         "Finding location", true, false); 
      findLocation(locationName); 
     } 
    }); 
} 

@Override 
public void onResume() 
{ 
    super.onResume(); 
    curLocOverlay.enableMyLocation(); 
} 

@Override 
public void onPause() 
{ 
    super.onPause(); 
    curLocOverlay.disableMyLocation(); 
} 

private void findLocation(final String locationName) 
{ 
    Thread thrd = new Thread() 
    { 
     public void run() 
     { 
      try 
      { 
       //do background work 
       addressList = geocoder.getFromLocationName(locationName, 5); 
       //send message to handler to process results 
       uiCallback.sendEmptyMessage(0); 
      } 
      catch (IOException e) 
      { 
       e.printStackTrace(); 
      } 
     } 
    }; 
    thrd.start(); 
} 

//ui thread callback handler 
private Handler uiCallback = new Handler() 
{ 
    @Override 
    public void handleMessage(Message msg) 
    { 
     progDialog.dismiss(); 
     if(addressList != null && addressList.size() > 0) 
     { 
      int lat = (int)(addressList.get(0).getLatitude()*1E6); 
      int lng = (int)(addressList.get(0).getLongitude()*1E6); 
      GeoPoint pt = new GeoPoint(lat, lng); 
      locations.add(new Location(pt, addressList.get(0).getFeatureName(), addressList.get(0).getAddressLine(0))); 
      pushpin.setItems(locations); 
      mapView.getOverlays().add(pushpin); 
      mapView.getController().setCenter(locations.get(locations.size()-1).Point); 
      mapView.getController().setZoom(15); 
     } 
     else 
     { 
      Dialog foundNothingDlg = new AlertDialog.Builder(GeoCodeDemoActivity.this) 
            .setIcon(0) 
            .setTitle("Failed to find location") 
            .setPositiveButton("Ok", null) 
            .setMessage("Location not found...") 
            .create(); 
      foundNothingDlg.show(); 
     } 
    } 
}; 
}