2012-03-14 12 views
0

ユーザーが選択したスポットにマーカーを追加する際に問題が発生しています。ここに私のコードはcreateMarkerは( 選択したポイントにマップマーカーを追加する

public class MyOverlays extends ItemizedOverlay<OverlayItem> { 

private static int maxNum = 5; 
private OverlayItem overlays[] = new OverlayItem[maxNum]; 
//private ArrayList<OverlayItem> overlays = new ArrayList<OverlayItem>(); 

private int index = 0; 
private boolean full = false; 
private MyOverlays itemizedoverlay; 

private Context context; 


public MyOverlays(Drawable defaultMarker) { 
    super(boundCenterBottom(defaultMarker)); 

    context = Application.getAppContext(); 
} 


     @Override 
     public boolean onTouchEvent(MotionEvent event, MapView mapView) 
     { 
      //---when user lifts his finger--- 
      if (event.getAction() == 1) {     
       GeoPoint p = mapView.getProjection().fromPixels(
        (int) event.getX(), 
        (int) event.getY()); 
        Toast.makeText(context, 
         p.getLatitudeE6()/1E6 + "," + 
         p.getLongitudeE6() /1E6 , 
         Toast.LENGTH_SHORT).show(); 

        int lat = p.getLatitudeE6(); 
        int lng = p.getLongitudeE6(); 

        int latTest = p.getLatitudeE6()/1000000; 
        int lngTest = p.getLongitudeE6()/1000000; 

        //Add marker for selected area 
        GeoPoint point2 = new GeoPoint(latTest, lngTest); 
        OverlayItem overlayitem2 = new OverlayItem(point2, "Test, konichiwa!", "Test"); 
        itemizedoverlay.addOverlay(overlayitem2); 
        mapView.getOverlays().add(itemizedoverlay); 

        SharedPreferences longSettings = context.getSharedPreferences("LONGITUDE", 0); 
        SharedPreferences latSettings = context.getSharedPreferences("LATITUDE", 0); 
        Editor e = longSettings.edit(); 
        Editor e2 = latSettings.edit(); 
        e.putInt("LONGITUDE", lng); 
        e2.putInt("LATITUDE", lat); 

        e.commit(); 
        e2.commit(); 


      }       
      return false; 
     }   




@Override 
protected OverlayItem createItem(int i) { 
    return overlays[i]; 
} 

@Override 
public int size() { 
    if (full) { 
     return overlays.length; 
    } else { 
     return index; 
    } 

} 

public void addOverlay(OverlayItem overlay) { 
    if (index < maxNum) { 
     overlays[index] = overlay; 
    } else { 
     index = 0; 
     full = true; 
     overlays[index] = overlay; 
    } 
    index++; 
    populate(); 
} 


} 

MyOverlays.java

public class ShowMapActivity extends MapActivity { 

public static Context context; 
private MapController mapController; 
MapView mapView; 
private LocationManager locationManager; 
private MyOverlays itemizedoverlay; 

private int latitude; 
private int longitude; 

private int lat; 
private int lng; 

public void onCreate(Bundle bundle) { 
    super.onCreate(bundle); 
    setContentView(R.layout.map); // bind the layout to the activity 

    // create a map view 
    //RelativeLayout relativeLayout = (RelativeLayout) findViewById(R.id.map); 
    mapView = (MapView) findViewById(R.id.mapview); 
    mapView.setBuiltInZoomControls(true); 
    // Either satellite or 2d 
    mapView.setSatellite(true); 
    mapController = mapView.getController(); 
    mapController.setZoom(14); // Zoon 1 is world view 
    locationManager = (LocationManager) getSystemService(Context.LOCATION_SERVICE); 
    locationManager.requestLocationUpdates(LocationManager.GPS_PROVIDER, 0, 
      0, new GeoUpdateHandler()); 

    Drawable drawable = this.getResources().getDrawable(R.drawable.point); 
    itemizedoverlay = new MyOverlays(drawable); 
    createMarker(); 

} 



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



public class GeoUpdateHandler implements LocationListener { 
//ignore this :) 
    @Override 
    public void onLocationChanged(Location location) { 

     latitude = (int) (location.getLatitude() * 1E6); 
     longitude = (int) (location.getLongitude() * 1E6); 
     GeoPoint point = new GeoPoint(latitude, longitude); 
     //createMarker(); 
     //Stop refreshing pointer 
     //mapController.animateTo(point); // mapController.setCenter(point); 

    } 

    @Override 
    public void onProviderDisabled(String provider) { 
    } 

    @Override 
    public void onProviderEnabled(String provider) { 
    } 

    @Override 
    public void onStatusChanged(String provider, int status, Bundle extras) { 
    } 
} 

private void createMarker() { 
    GeoPoint p = mapView.getMapCenter();   
    OverlayItem overlayitem = new OverlayItem(p, "", ""); 
    itemizedoverlay.addOverlay(overlayitem); 
    mapView.getOverlays().add(itemizedoverlay); 
    mapView.invalidate(); 

} 

public void onBackPressed() { 
    finish(); 
} 


} 

である) 'MyOverlays' の中に手動でそれをやろうとしたときに、私のShowMapActivityで正常に動作しなく。私は位置パラメータを正しく与えているかどうかはわかりませんでしたので、両方の方法を試しました(latとlatTestを参照)。それは問題には現れません。

STACKTRACE

03-14 04:24:54.596: E/AndroidRuntime(31512): FATAL EXCEPTION: main 
03-14 04:24:54.596: E/AndroidRuntime(31512): java.lang.NullPointerException 
03-14 04:24:54.596: E/AndroidRuntime(31512): at  com.lol.MyOverlays.onTouchEvent(MyOverlays.java:60) 
03-14 04:24:54.596: E/AndroidRuntime(31512): at com.google.android.maps.OverlayBundle.onTouchEvent(OverlayBundle.java:63) 
03-14 04:24:54.596: E/AndroidRuntime(31512): at com.google.android.maps.MapView.onTouchEvent(MapView.java:679) 
03-14 04:24:54.596: E/AndroidRuntime(31512): at android.view.View.dispatchTouchEvent(View.java:3901) 
03-14 04:24:54.596: E/AndroidRuntime(31512): at android.view.ViewGroup.dispatchTouchEvent(ViewGroup.java:903) 
03-14 04:24:54.596: E/AndroidRuntime(31512): at android.view.ViewGroup.dispatchTouchEvent(ViewGroup.java:942) 
03-14 04:24:54.596: E/AndroidRuntime(31512): at android.view.ViewGroup.dispatchTouchEvent(ViewGroup.java:942) 
03-14 04:24:54.596: E/AndroidRuntime(31512): at android.view.ViewGroup.dispatchTouchEvent(ViewGroup.java:942) 
03-14 04:24:54.596: E/AndroidRuntime(31512): at android.view.ViewGroup.dispatchTouchEvent(ViewGroup.java:942) 
03-14 04:24:54.596: E/AndroidRuntime(31512): at com.android.internal.policy.impl.PhoneWindow$DecorView.superDispatchTouchEvent(PhoneWindow.java:1714) 
03-14 04:24:54.596: E/AndroidRuntime(31512): at com.android.internal.policy.impl.PhoneWindow.superDispatchTouchEvent(PhoneWindow.java:1130) 
03-14 04:24:54.596: E/AndroidRuntime(31512): at android.app.Activity.dispatchTouchEvent(Activity.java:2096) 
03-14 04:24:54.596: E/AndroidRuntime(31512): at com.android.internal.policy.impl.PhoneWindow$DecorView.dispatchTouchEvent(PhoneWindow.java:1698) 
03-14 04:24:54.596: E/AndroidRuntime(31512): at android.view.ViewRoot.deliverPointerEvent(ViewRoot.java:2200) 
03-14 04:24:54.596: E/AndroidRuntime(31512): at android.view.ViewRoot.handleMessage(ViewRoot.java:1884) 
03-14 04:24:54.596: E/AndroidRuntime(31512): at android.os.Handler.dispatchMessage(Handler.java:99) 
03-14 04:24:54.596: E/AndroidRuntime(31512): at android.os.Looper.loop(Looper.java:130) 
03-14 04:24:54.596: E/AndroidRuntime(31512): at android.app.ActivityThread.main(ActivityThread.java:3835) 
03-14 04:24:54.596: E/AndroidRuntime(31512): at java.lang.reflect.Method.invokeNative(Native Method) 
03-14 04:24:54.596: E/AndroidRuntime(31512): at java.lang.reflect.Method.invoke(Method.java:507) 
03-14 04:24:54.596: E/AndroidRuntime(31512): at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:847) 
03-14 04:24:54.596: E/AndroidRuntime(31512): at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:605) 
03-14 04:24:54.596: E/AndroidRuntime(31512): at dalvik.system.NativeStart.main(Native Method) 

誰もが任意の指導を持っていますか?このLink.itで

答えて

0

ルックは便利.. http://www.vogella.de/articles/AndroidLocationAPI/article.htmlとitemizedoverlayが初期化されることはありませんように、これはまたAnother link

+0

おかげではなく、それらのどちらも、実際に追加することを経ますタッチされた位置へのマーカー。彼らは特定の位置のためのマーカーを作成することについて言及していますが、私はそれを持っていて、それは働いています。私が必要とするのは、onTouchEventメソッドのMyOverlaysからマーカーを設定できることです。 – CitizenSmif

+0

このリンクを参照してください。これはonTouchEventで使用されています。http://mobiforge.com/developing/story/using-google-maps-android – user1213202

+0

ありがとうこのチュートリアルでは、マーカーの特定の配置のみを表示しています。問題は、私は同じデータにアクセスする方法を知らないので、ヘルパークラスであるMyOverlaysクラスからマーカーを設定する必要があるということです。私は投稿をする前に徹底的に答えを探しました。私は前にこれらのリンクを見ました。私はそれが奇妙なこの機能は一般的ではないことがわかります。 – CitizenSmif

0

が私に見えることがあります。

つまり、あなたがトップでそれを宣言しますと、まだヌルながら、あなたはそれを逆参照しよう

private MyOverlays itemizedoverlay; 

:リンクについて

itemizedoverlay.addOverlay(overlayitem2); 
+0

ありがとうマイク、あなたの右のように見えます。 MyOverylaysクラス内でこれを初期化するにはどうすればよいのですか?私は、 'MyOverlays'コンストラクタに渡されたdefaultMarkerにアクセスできるようにするために、上部に「private Drawable defaultMarker」を追加しようとしました。これはうまくいかなかった。私は 'this.getResources()。getDrawable(R.drawable.point);'をどのように呼び出すことができるのか分かりません。 MyOverlaysクラスでは、 'itemizedoverlay = new MyOverlays(drawable);'を呼び出すためにShowMapActivityで行います。申し訳ありませんが、コーディング時にnoobのビット。 – CitizenSmif

関連する問題