首页 > 解决方案 > 除了 onMapReady 之外,如何在 Google 地图中添加自定义标记

问题描述

我正在努力解决一个问题。如何在 Google Maps Activity 中实现方法来添加标记。

我想创建带有两个参数(纬度,经度)的方法,并在每次我的 restfull 客户端给我新数据时添加标记。

我的问题实际上是我想遵守 MVC 约定。当我将改造控制器包含到 MapsActivity 中时,一切正常。

当我将数据从 Controller 发送到 MapsActivity(以 NullPointerException 结尾)时,问题就开始了。

地图活动:

public class MapsActivity extends FragmentActivity implements 
OnMapReadyCallback {

private GoogleMap mMap;

private Handler mHandler = new Handler();



@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_maps);
    SupportMapFragment mapFragment = (SupportMapFragment) getSupportFragmentManager()
            .findFragmentById(R.id.map);

    mapFragment.getMapAsync(this);


}

public void onCarChangeLocation(Double lat, Double lon) {


    LatLng carLatLng = new LatLng(lat, lon);
    mMap.addMarker(new MarkerOptions().position(carLatLng).title("Integra Location"));
    mMap.moveCamera(CameraUpdateFactory.newLatLngZoom(carLatLng, 15.5f));


}




public Runnable getDataRunnable = new Runnable() {
    @Override
    public void run() {
        Controller controller = new Controller();
        controller.getData();
        mHandler.postDelayed(this,1000);
    }
};

@Override
public void onMapReady(GoogleMap googleMap) {

     mMap = googleMap;
     getDataRunnable.run();


}



}

控制器:

public class Controller {

public static final String BASE_URL = "server_ip";
private static Retrofit retrofit = null;
 public Double lat;
public Double lon;
public void getData() {

    if (retrofit == null) {
        retrofit = new Retrofit.Builder()
                .baseUrl(BASE_URL)
                .addConverterFactory(GsonConverterFactory.create())
                .build();

    }

    JsonPlaceHolderApi jsonPlaceHolderApi = retrofit.create(JsonPlaceHolderApi.class);
    Call<OutputModel> call = jsonPlaceHolderApi.getCords();

    call.enqueue(new Callback<OutputModel>() {
        @Override
        public void onResponse(Call<OutputModel> call, retrofit2.Response<OutputModel> response) {

            if (!response.isSuccessful()) {
                // onFailTV.setText("Code: " + response.code());
                return;
            }


           // mMap.clear();
            lat = response.body().getLatitude();
            lon = response.body().getLongitude();
            MapsActivity mapsActivity = new MapsActivity();
            mapsActivity.onCarChangeLocation(lat, lon);




        }


        @Override
        public void onFailure(Call<OutputModel> call, Throwable t) {

        }
    });
}
}

感谢您的回复。

标签: javaandroidgoogle-maps

解决方案


如下更新您的 MapsActivity 代码

public class MapsActivity extends FragmentActivity implements
        OnMapReadyCallback {
    private GoogleMap mMap;
    private Handler mHandler = new Handler();
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_maps);
        SupportMapFragment mapFragment = (SupportMapFragment) getSupportFragmentManager()
                .findFragmentById(R.id.map);
        mapFragment.getMapAsync(this);
        getDataRunnable.run();
    }
    LatLng carLatLng;
    public void onCarChangeLocation(Double lat, Double lon) {
        if (mMap != null) {//Check here map is not initialized 
            carLatLng = new LatLng(lat, lon);
            mMap.addMarker(new MarkerOptions().position(carLatLng).title("Integra Location"));
            mMap.moveCamera(CameraUpdateFactory.newLatLngZoom(carLatLng, 15.5f));
        } else {
            carLatLng = new LatLng(lat, lon);
        }

    }
    public Runnable getDataRunnable = new Runnable() {
        @Override
        public void run() {
            Controller controller = new Controller();
            controller.getData();
            mHandler.postDelayed(this, 1000);
        }
    };
    @Override
    public void onMapReady(GoogleMap googleMap) {
        mMap = googleMap;
        if (carLatLng != null) { //recall for setup pin
            onCarChangeLocation(carLatLng.latitude, carLatLng.longitude);
        }
    }
}

推荐阅读