2012-04-24 50 views
0

我想在mapview上添加多個標記,我不能使它工作,它不會
似乎加載甚至mapview當我評論調用LoadMarkers()方法時, 。 你能告訴我我的代碼有什麼問題嗎?ItemizedOverlays Android地圖不工作

public class MyATMLocatorActivity extends MapActivity { 
    /** Called when the activity is first created. */ 

    private MapView mapView; 
    private MapController myMapController; 
    private GeoPoint myGeoPoint; 
    private LocationManager myLocationManager; 
    private LocationListener myLocationListener; 

    public static Context context; 
    private MyItemizedOverlay myItemizedOverlay = null; 
    private MyLocationOverlay myLocationOverlay = null; 

    @Override 
    public void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     context = getApplicationContext(); 
     setContentView(R.layout.main); 

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

     myMapController = mapView.getController(); 

     this.LoadMarkers(); 

    } 

這是加載標記方法..

private void LoadMArkers() { 

     mapView.getOverlays().clear(); 
     mapView.postInvalidate(); 

     OverlayItem overlayItem = null; 

     Drawable myATMPic = getResources().getDrawable(R.drawable.atmicon); 
     myATMPic.setBounds(0, 0, myATMPic.getIntrinsicWidth(), myATMPic.getIntrinsicHeight()); 

     // Super España 
     myItemizedOverlay = new MyItemizedOverlay(myATMPic); 
     myGeoPoint = new GeoPoint((int) (-25.353043), (int) (-57.444495)); 
     overlayItem = new OverlayItem(myGeoPoint, "Supermercado Espana","Capiatá"); 
     myItemizedOverlay.addOverlay(overlayItem); 
     mapView.getOverlays().add(myItemizedOverlay); 

     // Martín Ledesma 
     myItemizedOverlay = new MyItemizedOverlay(myATMPic); 
     myGeoPoint = new GeoPoint((int) (-25.353974), (int) (-57.445214)); 
     overlayItem = new OverlayItem(myGeoPoint, "Martín Ledesma", "Capiatá"); 
     myItemizedOverlay.addOverlay(overlayItem); 
     mapView.getOverlays().add(myItemizedOverlay);    

     mapView.postInvalidate(); 
    } 

,這是我的ItemizedOverlay()類

public class MyItemizedOverlay extends com.google.android.maps.ItemizedOverlay<OverlayItem> { 

    private Context mContext; 
    private ArrayList<OverlayItem> myOverlaysArray = new ArrayList<OverlayItem>();; 

    private GeoPoint geoPoint = null; 

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

    public MyItemizedOverlay(Drawable defaultMarker, Context context) { 
     super(boundCenterBottom(defaultMarker)); 
     mContext = context; 
    } 

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

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

    // Removes overlay item i 
    public void removeItem(int i) { 
     myOverlaysArray.remove(i); 
     populate(); 
    } 

    // Returns present number of items in list 
    @Override 
    public int size() { 
     return myOverlaysArray.size(); 
    } 

    public void addOverlayItem(OverlayItem overlayItem) { 
     myOverlaysArray.add(overlayItem); 
     populate(); 
    } 

    public void addOverlayItem(int lat, int lon, String title) { 
     try { 
      geoPoint = new GeoPoint(lat, lon); 
      OverlayItem overlayItem = new OverlayItem(geoPoint, title, null); 
      addOverlayItem(overlayItem); 
     } catch (Exception e) { 
      e.printStackTrace(); 
     } 
    } 

    @Override 
    protected boolean onTap(int index) { 
     OverlayItem item = myOverlaysArray.get(index); 
     AlertDialog.Builder dialog = new AlertDialog.Builder(mContext); 
     dialog.setTitle(item.getTitle()); 
     dialog.setMessage(item.getSnippet()); 
     dialog.show(); 
     return true; 
    } 

} 
+0

看看我的解決方案。 – JustinDanielson 2012-04-24 03:05:49

+0

是你的問題解決? – 2012-04-25 02:24:10

回答

0

你添加正確的代碼到Android清單。 XML? 使用MapView將com.google.android.maps作爲子項添加到應用程序元素。

<uses-library android:name="com.google.android.maps" /> 

將INTERNET作爲子元素添加到元素中。

<uses-permission android:name="android.permission.INTERNET" /> 

您不需要創建2個分項疊加。此外,您需要將所有GPS座標乘以1e6,然後將它們投射到整數。在您之前的代碼中,兩個GPS座標將被轉換爲相同的整數對值,並且標記將放置在地圖上的相同位置(-25,-57),並且只有最後一個可以觸摸。另外,不要忘記將應用程序的上下文傳遞給逐項疊加。

MyATMLocatorActivity.java

package maps.test; 

import java.util.List; 

import android.content.Context; 
import android.graphics.drawable.Drawable; 
import android.location.LocationListener; 
import android.location.LocationManager; 
import android.os.Bundle; 

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 com.google.android.maps.MyLocationOverlay; 
import com.google.android.maps.Overlay; 
import com.google.android.maps.OverlayItem; 

public class MyATMLocatorActivity extends MapActivity { 
    /** Called when the activity is first created. */ 

    private MapView mapView; 
    private MapController myMapController; 
    private GeoPoint myGeoPoint; 
    private GeoPoint myGeoPoint2; 
    private LocationManager myLocationManager; 
    private LocationListener myLocationListener; 

    public static Context context; 
    private MyItemizedOverlay myItemizedOverlay = null; 
    private final MyLocationOverlay myLocationOverlay = null; 

    @Override 
    public void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     context = getApplicationContext(); 
     setContentView(R.layout.main); 

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

     myMapController = mapView.getController(); 

     this.LoadMarkers(); 

    } 

    private void LoadMarkers() { 

     List<Overlay> overlays = mapView.getOverlays(); 
     mapView.postInvalidate(); 

     OverlayItem overlayItem = null; 

     Drawable myATMPic = getResources().getDrawable(R.drawable.ic_launcher); 
     myATMPic.setBounds(0, 0, myATMPic.getIntrinsicWidth(), myATMPic.getIntrinsicHeight()); 
     myItemizedOverlay = new MyItemizedOverlay(myATMPic, this); 

     // Super España 
     myGeoPoint = new GeoPoint((int) (-25.353043*1e6), (int) (-57.444495*1e6)); 
     overlayItem = new OverlayItem(myGeoPoint, "Supermercado Espana","Capiatá"); 
     myItemizedOverlay.addOverlay(overlayItem); 

     // Martín Ledesma 
     myGeoPoint = new GeoPoint((int) (25.353974*1e6), (int) (-57.445214*1e6)); 
     overlayItem = new OverlayItem(myGeoPoint2, "Martín Ledesma", "Capiatá"); 
     myItemizedOverlay.addOverlay(overlayItem); 

     overlays.add(myItemizedOverlay); 
     mapView.postInvalidate(); 
    } 


    @Override 
    protected boolean isRouteDisplayed() { 
     // TODO Auto-generated method stub 
     return false; 
    } 
} 

MyItemizedOverlay.java

package maps.test; 

import java.util.ArrayList; 

import android.app.AlertDialog; 
import android.content.Context; 
import android.graphics.drawable.Drawable; 

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

public class MyItemizedOverlay extends com.google.android.maps.ItemizedOverlay<OverlayItem> { 

    private Context mContext; 
    private final ArrayList<OverlayItem> myOverlaysArray = new ArrayList<OverlayItem>(); 
    private GeoPoint geoPoint = null; 
    public MyItemizedOverlay(Drawable defaultMarker) { 
     super(boundCenterBottom(defaultMarker)); 
    } 

    public MyItemizedOverlay(Drawable defaultMarker, Context context) { 
     super(boundCenterBottom(defaultMarker)); 
     mContext = context; 
    } 

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

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

    // Removes overlay item i 
    public void removeItem(int i) { 
     myOverlaysArray.remove(i); 
     populate(); 
    } 

    // Returns present number of items in list 
    @Override 
    public int size() { 
     return myOverlaysArray.size(); 
    } 

    public void addOverlayItem(OverlayItem overlayItem) { 
     myOverlaysArray.add(overlayItem); 
     populate(); 
    } 

    public void addOverlayItem(int lat, int lon, String title) { 
     try { 
      geoPoint = new GeoPoint(lat, lon); 
      OverlayItem overlayItem = new OverlayItem(geoPoint, title, null); 
      addOverlayItem(overlayItem); 
     } catch (Exception e) { 
      e.printStackTrace(); 
     } 
    } 

    @Override 
    protected boolean onTap(int index) { 
     OverlayItem item = myOverlaysArray.get(index); 
     AlertDialog.Builder dialog = new AlertDialog.Builder(mContext); 
     dialog.setTitle(item.getTitle()); 
     dialog.setMessage(item.getSnippet()); 
     dialog.show(); 
     return true; 
    } 
} 

我測試過的代碼在一個示例應用程序,這是我的Android清單,把它比作自己。

<?xml version="1.0" encoding="utf-8"?> 
<manifest xmlns:android="http://schemas.android.com/apk/res/android" 
    package="maps.test" 
    android:versionCode="1" 
    android:versionName="1.0" > 
    <uses-sdk android:minSdkVersion="8" /> 
    <uses-permission android:name="android.permission.INTERNET" /> 
    <application 
     android:icon="@drawable/ic_launcher" 
     android:label="@string/app_name" > 
     <uses-library android:name="com.google.android.maps" /> 
     <activity 
      android:name=".MyATMLocatorActivity" 
      android:label="@string/app_name" > 
      <intent-filter> 
       <action android:name="android.intent.action.MAIN" /> 
       <category android:name="android.intent.category.LAUNCHER" /> 
      </intent-filter> 
     </activity> 
    </application> 
</manifest> 

這裏是我的main.xml

<?xml version="1.0" encoding="utf-8"?> 
<com.google.android.maps.MapView 
    xmlns:android="http://schemas.android.com/apk/res/android" 
    android:id="@+id/mapview" 
    android:layout_width="fill_parent" 
    android:layout_height="fill_parent" 
    android:clickable="true" 
    android:apiKey="Your Maps API Key goes here" 
/> 
+0

感謝您的快速回答!我會嘗試你的示例代碼,並讓你知道! – gustav12 2012-04-24 15:25:40

+0

賈斯汀,你的解決方案是完美的.. !!!我試過了,你是對的!非常感謝您的幫助!!! – gustav12 2012-04-28 22:48:52

+0

不客氣。如果您有任何其他問題,請給我留言,我會盡我所能。我剛剛完成了一個使用地圖的應用程序。 – JustinDanielson 2012-04-29 06:43:02