开发者

Android Map application forces close when map marker is clicked

I'm building a google map application that marks several points on the map. I'm currently trying to get the dialog box to appear when the marker is clicked. Right now, the markers appear at the right places but when i click them, the entire application stops unexpectedly/forced to close. Does anyone have any suggestions on what is wrong and how i should go about fixing it?

MyMapsActivity.java class:

package net.learn2develop.MyGoogleMapsNew;


import java.util.List;

import android.graphics.drawable.Drawable;
import android.os.Bundle;

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;

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

 public MyItemOverlay itemoverlay;

    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.main);
        MapView mapView = (MapView) findViewById(R.id.mapview);
        //MapView = new MapView(this, "example_Maps_ApiKey_String");
        mapView.setBuiltInZoomControls(true);

        List<Overlay> mapOverlays = mapView.getOverlays();
        Drawable drawable = this.getResources().getDrawable(R.drawable.androidmarker);
        itemoverlay = new MyItemOverlay(drawable);

        GeoPoint point1 = new GeoPoint(19240000,-99120000);
        OverlayItem overlayitem1 = new OverlayItem(point1, "Hola, Mundo!", "I'm in Mexico City!");

        GeoPoint point2 = new GeoPoint(35410000, 139460000);
        OverlayItem overlayitem2 = new OverlayItem(point2, "Sekai, konichiwa!", "I'm in Japan!");

        GeoPoint point3 = new GeoPoint(39000000, -77000000);
        OverlayItem overlayitem3 = new OverlayItem(point3, "","");


        itemoverlay.addOverlay(overlayitem1);
        itemoverlay.addOverlay(overlayitem2);
        itemoverlay.addOverlay(overlayitem3);

        mapOverlays.add(itemoverlay);

    }

    protected boolean isRouteDisplayed() {
        return false;
    }
}

MyItemOverlay class:

package net.learn2develop.MyGoogleMapsNew;

import java.util.ArrayList;

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

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

public class MyItemOverlay extends ItemizedOverlay {

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

 public MyItemOverlay(Drawable defaultMarker) {
  super(boundCenterBottom(defaultMarker));
  // TODO Auto-generated constructor stub
 }

 public MyItemOverlay(Drawable defaultMarker, Context context) {
    super(defaultMarker);
    mContext = context;
 }
 @Override
 protected boolean onTap(int index) {
   OverlayItem item = mOverlays.get(index);
   AlertDialog.Builder dialog = new AlertDialog.Builder(mContext);
   dialog.setTitle(item.getTitle());
   dialog.setMessage(item.getSnippet());
   dialog.show()开发者_开发技巧;
   return true;
 }

/* protected boolean onTap(int index) {
        OverlayItem item = mOverlays.get(index);
        AlertDialog.Builder dialog = new AlertDialog.Builder(mContext);
        dialog.setTitle(item.getTitle());
        dialog.setMessage(item.getSnippet());
        dialog.setPositiveButton("Yes", new OnClickListener() {    
            @Override
            public void onClick(DialogInterface dialog, int which) {
                dialog.dismiss();
            }
        });
        dialog.show();
        return true;
    }
}*/


// @Override
 /*protected OverlayItem createItem(int arg0) {
  // TODO Auto-generated method stub
  return null;
 }*/

 /*@Override
 public int size() {
  // TODO Auto-generated method stub
  return 0;
 }*/

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

 public void addOverlay(OverlayItem overlay) {
     mOverlays.add(overlay);
     populate();
 }
 @Override
 protected OverlayItem createItem(int i) {
   return mOverlays.get(i);
 }


}

AndroidManifest.xml file

<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
      package="net.learn2develop.MyGoogleMapsNew"
      android:versionCode="1"
      android:versionName="1.0">
      <uses-permission android:name="android.permission.ACCESS_FINE_LOCATION"/>
    <application android:icon="@drawable/icon" android:label="@string/app_name">
  <uses-library android:name="com.google.android.maps" />
         <activity android:name=".MyMapsActivity"
                  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>

    <uses-permission 
        xmlns:android="http://schemas.android.com/apk/res/android" 
        android:name="android.permission.INTERNET">
    </uses-permission>

    <uses-permission 
        xmlns:android="http://schemas.android.com/apk/res/android" 
        android:name="android.permission.ACCESS_COARSE_LOCATION">
    </uses-permission>
    <uses-sdk android:minSdkVersion="3" />

</manifest>


Change

itemoverlay = new MyItemOverlay(drawable);

to

itemoverlay = new MyItemOverlay(drawable, this);

in MyMapsActivity.java


In MyMapsActivity.java, you need to change:

itemoverlay = new MyItemOverlay(drawable);

(as mentioned by Bobby P) to

itemoverlay = new MyItemOverlay(drawable, this);

AND change your second constructor in MyItemOverlay.java from:

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

to:

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

上一篇:

下一篇:

精彩评论

暂无评论...
验证码 换一张
取 消

最新问答

问答排行榜