0

私の仕事は、ユーザーの現在地を地図上のオーバーレイとして表示することです。

これまでのところ、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());

そこの場所は正しいです。

座標を丸めていることはわかっていますが、これにより多少間違った結果が得られます(GeoPointがintのみを受け入れるための簡単な修正です)。ただし、オーバーレイも間違った場所に表示されないため、これは問題ではありません。まったく表示されません。

編集: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);

したがって、問題はどこかにあります。

4

1 に答える 1

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;
}
于 2012-10-30T14:42:56.930 に答える