简体   繁体   English

除了onMapReady之外,如何在Google地图中添加自定义标记

[英]How to add custom Marker in Google maps besides onMapReady

I'm struggling with one question. 我正在努力解决一个问题。 How can I implement method in Google Maps Activity to add marker. 如何在Google Maps Activity中实现添加标记的方法。

I wanna to create method with two params (lat, lon) and in this place adding markers every time when my restfull client give me new data. 我想创建带有两个参数(纬度,经度)的方法,并在每次我restfull客户给我新数据时在此位置添加标记。

My problem is in fact that I wanna stay with MVC convention. 我的问题实际上是我想坚持使用MVC约定。 When I'm including retrofit controller into MapsActivity all works fine. 当我将改造控制器包括到MapsActivity中时,一切正常。

Problem begins when I send data from Controller to MapsActivity (Ends with NullPointerException). 当我从控制器向MapsActivity发送数据时,问题开始了(以NullPointerException结尾)。

MapsActivty: MapsActivty:

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();


}



}

Controller: 控制器:

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) {

        }
    });
}
}

Thanks for any reply. 感谢您的答复。

Update your MapsActivity code as bellow 在下面更新您的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);
        }
    }
}

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM