[英]How to add custom Marker in Google maps besides onMapReady
我正在努力解決一個問題。 如何在Google Maps Activity中實現添加標記的方法。
我想創建帶有兩個參數(緯度,經度)的方法,並在每次我restfull客戶給我新數據時在此位置添加標記。
我的問題實際上是我想堅持使用MVC約定。 當我將改造控制器包括到MapsActivity中時,一切正常。
當我從控制器向MapsActivity發送數據時,問題開始了(以NullPointerException結尾)。
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();
}
}
控制器:
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) {
}
});
}
}
感謝您的答復。
在下面更新您的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.