【问题标题】:Working with Multiple Marker in Google Maps Android在 Google Maps Android 中使用多个标记
【发布时间】:2012-09-26 03:04:06
【问题描述】:

这是错误:

没有可以访问 MainActivity 类型的封闭实例。必须使用 MainActivity 类型的封闭实例来限定分配(例如 x.new A(),其中 x 是 MainActivity 的实例)。

错误出现在MyLocationListener.java这行代码的这行代码

 MyMapOverlays marker = new MyMapOverlays(p) ;

有人帮帮我吗?

代码如下:

MainActivity.class

package com.sample.dorm_locator_gps;

import com.google.android.maps.GeoPoint;
import com.google.android.maps.MapActivity;
import com.google.android.maps.MapController;
import com.google.android.maps.MapView;
import android.os.Bundle;
import android.graphics.BitmapFactory;
import android.graphics.Canvas;
import android.graphics.Point;
import android.location.Location;
import android.location.LocationListener;
import android.location.LocationManager;

public class MainActivity extends MapActivity {
    LocationManager locMgr;
    MyLocationListener locLstnr;

    private MapView mapView;
    private MapController mc;

    /** Called when the activity is first created. */

    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.main);
        mapView = (MapView) findViewById(R.id.mapview1);
        mc = mapView.getController();

        String coordinates[] = {"30", "71"};
        double lat = Double.parseDouble(coordinates[0]);
        double lng = Double.parseDouble(coordinates[1]);

        GeoPoint p = new GeoPoint(
                (int) (lat * 1E6),
                (int) (lng * 1E6));

        mc.animateTo(p);
        mc.setZoom(7);
        mapView.invalidate();
    }

    @Override
    protected boolean isRouteDisplayed() {
        // TODO Auto-generated method stub
        return false;
    }

    /*My overlay Class starts*/
    class MyMapOverlays extends com.google.android.maps.Overlay
    {
        GeoPoint location = null;

        public MyMapOverlays(GeoPoint location)
        {
            super();
            this.location = location;
        }

        @Override
        public void draw(Canvas canvas, MapView mapView, boolean shadow)
        {
            super.draw(canvas, mapView, shadow);
            //translate the screen pixels
            Point screenPoint = new Point();
            mapView.getProjection().toPixels(this.location, screenPoint);

            //add the image
            canvas.drawBitmap(BitmapFactory.decodeResource(getResources(), R.drawable.our_cross_image),
                    screenPoint.x, screenPoint.y , null); //Setting the image  location on the screen (x,y).
        }
    }
    /*My overlay Class ends*/
}

MyLocationListener.java

package com.sample.dorm_locator_gps;

import java.util.List;
import com.google.android.maps.GeoPoint;
import com.google.android.maps.MapController;
import com.google.android.maps.MapView;
import com.sample.dorm_locator_gps.MainActivity.MyMapOverlays;

import android.content.Context;
import android.location.Location;
import android.location.LocationListener;
import android.os.Bundle;
import android.widget.Toast;

public class MyLocationListener implements LocationListener
{
    private MapController mc;
    private MapView mapView;

    public void onLocationChanged(Location loc) {
        // TODO Auto-generated method stub
        loc.getLatitude();
        loc.getLongitude();
        String Text = "My current location is: " +  "Latitud = " + 
        loc.getLatitude() + "Longitud = " + loc.getLongitude();
        Toast.makeText( getApplicationContext(), Text, Toast.LENGTH_SHORT).show();

        String coordinates[] = {""+loc.getLatitude(), ""+loc.getLongitude()};
        double lat = Double.parseDouble(coordinates[0]);
        double lng = Double.parseDouble(coordinates[1]);
        GeoPoint p = new GeoPoint((int) (lat * 1E6),(int) (lng * 1E6));
        mc.animateTo(p);
        mc.setZoom(7);

        //add a location marker.
        MyMapOverlays marker = new MyMapOverlays(p) ;
        List listOfOverLays = mapView.getOverlays();
        listOfOverLays.clear();
        listOfOverLays.add(marker);
        mapView.invalidate();
    }

    private Context getApplicationContext() {
        // TODO Auto-generated method stub
        return null;

    }

    public void onProviderDisabled(String provider) {
        // TODO Auto-generated method stub
        Toast.makeText( getApplicationContext(),"Gps Disabled", Toast.LENGTH_SHORT ).show();

    }

    public void onProviderEnabled(String provider) {
        // TODO Auto-generated method stub
        Toast.makeText( getApplicationContext(),"Gps Enabled",Toast.LENGTH_SHORT).show();
    }

    public void onStatusChanged(String provider, int status, Bundle extras) {
        // TODO Auto-generated method stub
    }
}

【问题讨论】:

    标签: android maps


    【解决方案1】:

    您需要将 MyMapOverlays 声明为静态类。

    public static class MyMapOverlays.....
    

    【讨论】:

      【解决方案2】:

      MyMapOverlays 类移动到自己的文件中将解决问题并使您的设计更加灵活。

      目前您需要MainActivity 的实例来创建MyMapOverlays 的实例,但您的MyLocationListener 类不需要知道MainActivity 类。将其移动到单独的文件中会破坏这种不必要的耦合。

      【讨论】:

      • 创建一个新类(在 Eclipse 中,它是 File->New->Java->Class)。使用 MyMapOverlays 作为类名。然后将 MyMapOverlays 类的代码从 MainActivity 移动到刚刚创建的新类中。希望这会有所帮助。
      猜你喜欢
      • 2013-04-02
      • 2015-02-17
      • 2015-08-14
      • 2019-11-13
      • 1970-01-01
      • 1970-01-01
      • 2016-01-05
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多