2012-10-30 6 views
0

내 작업은 사용자의 현재 위치를지도에 오버레이로 표시하는 것입니다.MapView가 오버레이를 표시하지 않습니다.

지금까지 내가 GPS를 사용할 때 가장 좋은 방법은, 그것을 할 것을 발견, 다음과 같이이다 :

public class MyMapActivity extends MapActivity { 

    @Override 
    protected void onCreate(Bundle savedInstanceState) { 

     super.onCreate(savedInstanceState); 
     setContentView(R.layout.activity_map); 


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



    // Acquire a reference to the system Location Manager 
     LocationManager locationManager = (LocationManager) this.getSystemService(Context.LOCATION_SERVICE); 

     // Define a listener that responds to location updates 
     LocationListener locationListener = new LocationListener() { 
      public void onLocationChanged(Location location) { 

       // Called when a new location is found by the network location provider. 
       Log.d("location", "locationchanged: " + location.getLatitude() + ", " + location.getLongitude()); 

       List<Overlay> mapOverlays = mapView.getOverlays(); 
       GeoPoint point = new GeoPoint((int)location.getLatitude(), (int)location.getLongitude()); 
       OverlayItem overlayitem2 = new OverlayItem(point, "title", "hello home!"); 
       Drawable drawable = CouponsMapActivity.this.getResources().getDrawable(R.drawable.androidmarker); 
       HelloItemizedOverlay itemizedoverlay = new HelloItemizedOverlay(drawable, CouponsMapActivity.this); 
       itemizedoverlay.addOverlay(overlayitem2); 
       mapOverlays.add(itemizedoverlay); 
//    mapView.postInvalidate(); 
       mapView.invalidate(); 
      } 

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

      public void onProviderEnabled(String provider) {} 

      public void onProviderDisabled(String provider) {} 
      }; 

     // Register the listener with the Location Manager to receive location updates 
     locationManager.requestLocationUpdates(LocationManager.NETWORK_PROVIDER, 0, 0, locationListener); 


    } 
} 

내가

   Log.d("location", "locationchanged: " + location.getLatitude() + ", " + location.getLongitude()); 

위치에 디버그 포인트를 넣어 올바른가 .

나는 좌표를 반올림한다는 것을 알고 있는데 이것은 다소 잘못된 결과를 낳습니다. (이는 단지 int를 받아들이는 GeoPoint의 빠른 수정입니다.) 그러나 이것은 오버레이가 화면에 나타나지 않기 때문에 문제가되지 않습니다. 잘못된 위치. 그것은 전혀 나타나지 않습니다.

편집 : 여기 HelloItemizedOverlay입니다 :

공용 클래스 HelloItemizedOverlay는 ItemizedOverlay를 {확장

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

private Context mContext; 

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

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


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

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

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

@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; 
} 

참고 :

List<Overlay> mapOverlays = mapView.getOverlays(); 
    Drawable drawable = this.getResources().getDrawable(R.drawable.androidmarker); 
    final HelloItemizedOverlay itemizedoverlay = new HelloItemizedOverlay(drawable, this); 
    GeoPoint point2 = new GeoPoint(35410000, 139460000); 
    OverlayItem overlayitem2 = new OverlayItem(point2, "Sekai, konichiwa!", "I'm in Japan!"); 
    itemizedoverlay.addOverlay(overlayitem2); 
mapOverlays.add(itemizedoverlay); 
:이 같은 메인 스레드에서 수동으로 포인트를 설정할 때 오버레이가 작동

그래서 문제는 다른 곳에서 발생합니다.

+0

'HelloItemizedOverlay' 임 플리 멘 테이션을 제공 할 수 있습니까? 거기에 문제가있을 수 있습니다 .. –

+0

HelloItemizedOverlay – Ixx

+0

'LocationListerner' 메소드에'@ Override'를 추가하지 않는 것을 보았습니다. 이 문제는 –

답변

0

나는 이전에 같은 문제가 있었는데, 그것은 어떻게 든 드로어 블 바운드와 관련이있었습니다. HelloItemizedOverlay 생성자에서 drawable 매개 변수를 설정할 때이 메서드를 사용하십시오.

HelloItemizedOverlay itemizedoverlay = new HelloItemizedOverlay(boundCenterBottom(drawable), CouponsMapActivity.this); 


private Drawable boundCenterBottom(Drawable marker) { 
    marker.setBounds((-marker.getIntrinsicWidth())/2, -marker.getIntrinsicHeight(), 
      marker.getIntrinsicWidth()/2, 0); 
    return marker; 
} 
+0

문제는 드로어 블이 아니며, 내 포스트를 편집하고, 임의의 오버레이를 "수동으로"설정한다. 아마도 onCreate가 끝나고지도가 다시 그려지는 것과 관련이 있습니다. 하지만 invalidate()를 호출하고 있습니다. – Ixx

관련 문제