java - 除了 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) {
}
});
}
}
感谢您的回复。
解决方案
如下更新您的 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);
}
}
}
推荐阅读
- javascript - 如何自动设置从 API 检索到的图像的宽度?
- javascript - 在不使用 Vue-CLI 的情况下将样式表添加到 Vue.js 组件
- python - 我们可以对嵌套 for 循环使用列表理解,其中外部和内部 for 循环各有一个语句吗?
- node.js - 不和谐.js | 踢和禁止
- docker - 是否需要使用 Azure 容器注册表才能使用 Azure 容器?
- azure - 使用 powershell 使用访问令牌连接到 azure ad
- reactjs - 反应:将数据从子组件传递到父组件不会更新父组件中的值
- docker - 在 Dockerfile 中运行多个命令
- python - 切片列表以使用 Python 删除某些对象
- docker - 不能将参数传递给 awk