2012-06-04 2 views
0

사용자의 현재 위치를 표시하고 사용자가지도에 하나의 마커를 배치 할 수있게하려고합니다. 사용자가 마커를 두드리면 마커가 사라지고지도에 다른 마커를 다시 놓을 수 있습니다.Android 항목 오버레이! 지도에 마커를 배치하고 제거하십시오.

다음 코드는 사용자의 현재 위치를 표시하고지도에 하나의 표식을 배치하는 데 적합합니다. 또한 마커를 제거 할 수 있습니다. 하지만 일단 마커를 제거한 후에지도에 다시 놓으려고했습니다. 프로그램이 추락했습니다! 아무도 그 이유를 말해 줄 수 있습니까? 일식에서

class InterestingLocations extends ItemizedOverlay { 
    private ArrayList<OverlayItem> locations = new ArrayList<OverlayItem>(); 
    private GeoPoint center = null; 
    private Context mContext ; 
    private boolean placed=false; 


    public InterestingLocations(Drawable defaultMarker) { 
     super(boundCenterBottom(defaultMarker)); 
     // create locations of interest 
     GeoPoint me = new 
      GeoPoint((int)(lat*1000000),(int)(lng*1000000)); 

     locations.add(new OverlayItem(me, 
       "Me!", "Me! Me! Me!")); 
     center=me; 
     populate(); 
     } 

    public InterestingLocations(Drawable marker, Context context) 
    { 
     super(marker); 
     mContext= context; 
     // create locations of interest 
     GeoPoint me = new 
      GeoPoint((int)(lat*1000000),(int)(lng*1000000)); 

     locations.add(new OverlayItem(me, 
       "Me!", "Me!")); 
     center=me; 

     populate(); 
    } 

    // We added this method to find the middle point of the cluster 
    // Start each edge on its opposite side and move across with each point. 
    // The top of the world is +90, the bottom -90, 
    // the west edge is -180, the east +180 


    @Override 
    public void draw(Canvas canvas, MapView mapview, boolean shadow) { 
     // Here is where we can eliminate shadows by setting to false 
     super.draw(canvas, mapview, shadow); 
    } 

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

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

    public boolean onTap (final GeoPoint p, final MapView mapView){ 
     boolean tapped = super.onTap(p, mapView); 
     Log.i("onTap", "onTap 1"); 

     if (tapped){    
      Log.i("Hit item!!", "Hited"); 
      //do what you want to do when you hit an item  
      if(p!=me2){ 
       Log.i("Hit item!!", "Hited and p!=me2"); 
       removeOverlay(); 
       placed=false; 
      } 
     }   
     else{ 
      if(placed==false&&placeAble==true){ 
       Log.i("placed=="+placed, "placed==false"); 

       addOverlay(new OverlayItem(p, "Dest", "Destination")); 
       destLat = (float)p.getLatitudeE6()/1000000f; 
       destLng = (float)p.getLongitudeE6()/1000000f; 
       placed=true; 
      } 
      else{ 
       Log.i("placed=="+placed, "here is else"); 
      } 
      //do what you want to do when you DONT hit an item 
      }     
     return true; 
    } 


    //You must have this method, even if it doesn't visibly do anything 
    @Override 
    protected boolean onTap(int index) { 

     Log.i("Hit item!!", "Hited"+ index); 
     return true; 
    } 


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


    public void removeOverlay() { 
     locations.clear(); 
     GeoPoint me = new GeoPoint((int)(lat*1000000),(int)(lng*1000000)); 
     locations.add(new OverlayItem(me, "Me!", "Me! Me! Me!")); 
     populate(); 
    } 


} 

오류 :

06-04 18:03:03.859: E/global(29049): Deprecated Thread methods are not supported. 
06-04 18:03:03.859: E/global(29049): java.lang.UnsupportedOperationException 
06-04 18:03:03.859: E/global(29049): at java.lang.VMThread.stop(VMThread.java:85) 
06-04 18:03:03.859: E/global(29049): at java.lang.Thread.stop(Thread.java:1280) 
06-04 18:03:03.859: E/global(29049): at java.lang.Thread.stop(Thread.java:1247) 
06-04 18:03:03.859: E/global(29049): at com.knowithk.kpass.KPassActivity$1.run(KPassActivity.java:46) 
06-04 18:03:17.429: E/MapActivity(29049): Couldn't get connection factory client 
06-04 18:03:32.773: E/AndroidRuntime(29049): FATAL EXCEPTION: main 
06-04 18:03:32.773: E/AndroidRuntime(29049): java.lang.ArrayIndexOutOfBoundsException 
06-04 18:03:32.773: E/AndroidRuntime(29049): at com.google.android.maps.ItemizedOverlay.maskHelper(ItemizedOverlay.java:562) 
06-04 18:03:32.773: E/AndroidRuntime(29049): at com.google.android.maps.ItemizedOverlay.setFocus(ItemizedOverlay.java:365) 
06-04 18:03:32.773: E/AndroidRuntime(29049): at com.google.android.maps.ItemizedOverlay.focus(ItemizedOverlay.java:539) 
06-04 18:03:32.773: E/AndroidRuntime(29049): at com.google.android.maps.ItemizedOverlay.onTap(ItemizedOverlay.java:455) 
06-04 18:03:32.773: E/AndroidRuntime(29049): at com.knowithk.kpass.taxifare.MyMap$InterestingLocations.onTap(MyMap.java:333) 
06-04 18:03:32.773: E/AndroidRuntime(29049): at com.google.android.maps.OverlayBundle.onTap(OverlayBundle.java:83) 
06-04 18:03:32.773: E/AndroidRuntime(29049): at com.google.android.maps.MapView$1.onSingleTapUp(MapView.java:356) 
06-04 18:03:32.773: E/AndroidRuntime(29049): at com.google.android.maps.GestureDetector.onTouchEvent(GestureDetector.java:533) 
06-04 18:03:32.773: E/AndroidRuntime(29049): at com.google.android.maps.MapView.onTouchEvent(MapView.java:683) 
06-04 18:03:32.773: E/AndroidRuntime(29049): at android.view.View.dispatchTouchEvent(View.java:3938) 
06-04 18:03:32.773: E/AndroidRuntime(29049): at android.view.ViewGroup.dispatchTouchEvent(ViewGroup.java:903) 
06-04 18:03:32.773: E/AndroidRuntime(29049): at android.view.ViewGroup.dispatchTouchEvent(ViewGroup.java:942) 
06-04 18:03:32.773: E/AndroidRuntime(29049): at android.view.ViewGroup.dispatchTouchEvent(ViewGroup.java:942) 
06-04 18:03:32.773: E/AndroidRuntime(29049): at android.view.ViewGroup.dispatchTouchEvent(ViewGroup.java:942) 
06-04 18:03:32.773: E/AndroidRuntime(29049): at android.view.ViewGroup.dispatchTouchEvent(ViewGroup.java:942) 
06-04 18:03:32.773: E/AndroidRuntime(29049): at com.android.internal.policy.impl.PhoneWindow$DecorView.superDispatchTouchEvent(PhoneWindow.java:1733) 
06-04 18:03:32.773: E/AndroidRuntime(29049): at com.android.internal.policy.impl.PhoneWindow.superDispatchTouchEvent(PhoneWindow.java:1151) 
06-04 18:03:32.773: E/AndroidRuntime(29049): at android.app.Activity.dispatchTouchEvent(Activity.java:2096) 
06-04 18:03:32.773: E/AndroidRuntime(29049): at com.android.internal.policy.impl.PhoneWindow$DecorView.dispatchTouchEvent(PhoneWindow.java:1717) 
06-04 18:03:32.773: E/AndroidRuntime(29049): at android.view.ViewRoot.deliverPointerEvent(ViewRoot.java:2215) 
06-04 18:03:32.773: E/AndroidRuntime(29049): at android.view.ViewRoot.handleMessage(ViewRoot.java:1886) 
06-04 18:03:32.773: E/AndroidRuntime(29049): at android.os.Handler.dispatchMessage(Handler.java:99) 
06-04 18:03:32.773: E/AndroidRuntime(29049): at android.os.Looper.loop(Looper.java:130) 
06-04 18:03:32.773: E/AndroidRuntime(29049): at android.app.ActivityThread.main(ActivityThread.java:3687) 
06-04 18:03:32.773: E/AndroidRuntime(29049): at java.lang.reflect.Method.invokeNative(Native Method) 
06-04 18:03:32.773: E/AndroidRuntime(29049): at java.lang.reflect.Method.invoke(Method.java:507) 
06-04 18:03:32.773: E/AndroidRuntime(29049): at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:842) 
06-04 18:03:32.773: E/AndroidRuntime(29049): at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:600) 
06-04 18:03:32.773: E/AndroidRuntime(29049): at dalvik.system.NativeStart.main(Native Method) 
+0

stacktrace (logcat에 오류가 있음)를 게시하면보다 쉽게 ​​도움을받을 수 있습니다. – Reinier

+0

귀하의 조언에 진심으로 감사드립니다. – crystalWing

+0

333 행의 코드에는 무엇이 있습니까? Btw, 아마도 (p! = me2)를 (! p.equals (me2))로 변경하고 싶을 것입니다. – Reinier

답변

0

변화 당신이 보호 부울 ONTAP에 (INT 지수)이를 추가하여 탭 항목을 제거하는 방법 :

   mOverlays.remove(index); 
       setLastFocusedIndex(-1); 
       map.invalidate(); 

그것은 해결됩니다 너의 문제.

사실, ItemizedOverlay 및 OverlayItem 클래스의 디자인이 좋지 않다고 생각하는 유일한 사람입니까?

+0

아니요. 나는 또한 그들이 나쁜 디자인을 겪는다고 생각한다. MapActivity, MapView (단일 인스턴스 만) 및 MapFragment 부족과 관련된 모든 제한 사항과 함께. – hendrix

관련 문제