我有一个应用程序,它使用谷歌地图API来显示设备的位置,并向用户显示一堆标记。我的代码没有出错,整个应用程序运行正常,包括GPS位置跟踪。
我的问题是MapView不呈现实际的地图背景。我的意思是街道,街道名称等,但它呈现设备的位置(带有蓝点),我面对的方向(蓝点附近有蓝色箭头)和所有标记(我是从dinList创建一个ArrayList)。
问题可能是我在应用程序上有多个地图。
我提供了三个截图,每个地图实例之一,供你们分析,并分别在下面提供每个地图的java代码和XML。
第一张图片代码和XML:
XML,以便单词可以出现在MapView上方(请记住,这个单词曾经工作,但在我添加第三个单词后停止工作):
<RelativeLayout
android:layout_width="match_parent"
android:layout_height="200dp">
<com.google.android.gms.maps.MapView
android:id="@+id/mapInfoView"
android:layout_width="match_parent"
android:layout_height="200dp"
android:background="@color/backgroundColor"/>
<TextView
android:id="@+id/tv_tipo"
android:text="Tipo"
android:padding="10dp"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_alignParentLeft="true"
android:layout_alignParentBottom="true"/>
<TextView
android:id="@+id/tv_nome"
android:text="Nome"
android:padding="10dp"
android:textAppearance="?android:textAppearanceLarge"
android:layout_above="@id/tv_tipo"
android:layout_width="wrap_content"
android:layout_height="wrap_content"/>
</RelativeLayout>
第一张地图的代码,CreateMap()方法:
private void createMap(@Nullable Bundle savedInstanceState, View v) {
mMapView = (MapView) v.findViewById(R.id.mapInfoView);
mMapView.onCreate(savedInstanceState);
mMapView.onResume(); // needed to get the map to display immediately
try {
MapsInitializer.initialize(getActivity().getApplicationContext());
} catch (Exception e) {
e.printStackTrace();
}
mMapView.getMapAsync(new OnMapReadyCallback() {
@Override
public void onMapReady(GoogleMap mMap) {
googleMap = mMap;
// For showing a move to my location button
googleMap.setMyLocationEnabled(true);
// For dropping a marker at a point on the Map
LatLng prestador = new LatLng(Singleton.latitude, Singleton.longitude);
googleMap.addMarker(new MarkerOptions().position(prestador).title(Singleton.nome_empresa).snippet(Singleton.endereco));
// For zooming automatically to the location of the marker
CameraPosition cameraPosition = new CameraPosition.Builder().target(prestador).zoom(16).build();
googleMap.animateCamera(CameraUpdateFactory.newCameraPosition(cameraPosition));
googleMap.setPadding(800, 0, 0, 0);
}
});
}
第二张地图的XML,显示所有标记的地图:
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical">
<com.google.android.gms.maps.MapView
android:id="@+id/mapCompletoView"
android:layout_width="match_parent"
android:layout_height="match_parent" />
</LinearLayout>
第二张地图的代码:
private void createMap(Bundle savedInstanceState, View v) {
mMapView = (MapView) v.findViewById(R.id.mapCompletoView);
mMapView.onCreate(savedInstanceState);
mMapView.onResume(); // needed to get the map to display immediately
try {
MapsInitializer.initialize(Singleton.ContextMainActivity);
} catch (Exception e) {
e.printStackTrace();
}
mMapView.getMapAsync(new OnMapReadyCallback() {
@Override
public void onMapReady(GoogleMap mMap) {
googleMap = mMap;
// For showing a move to my location button
googleMap.setMyLocationEnabled(true);
// For dropping a marker at a point on the Map
LatLng dispositivo = new LatLng(Singleton.user_latitude,Singleton.user_longitude);
// For zooming automatically to the location of the marker
CameraPosition cameraPosition = new CameraPosition.Builder().target(dispositivo).zoom(16).build();
googleMap.animateCamera(CameraUpdateFactory.newCameraPosition(cameraPosition));
googleMap.setPadding(800,0,0,0);
if(Singleton.tipo_de_busca == "online"){
for(Prestador p : Singleton.lista_prestadores_online){
double latitude = Double.parseDouble(p.latitude);
double longitude = Double.parseDouble(p.longitude);
try {
googleMap.addMarker(new MarkerOptions().title(p.nome_empresa).snippet(p.telefone).position(new LatLng(latitude, longitude)));
}catch(Exception e){
e.toString();
}
}
}else{
for(Prestador p : Singleton.lista_prestadores_offline){
double latitude = Double.parseDouble(p.latitude);
double longitude = Double.parseDouble(p.longitude);
googleMap.addMarker(new MarkerOptions().title(p.nome_empresa).snippet(p.telefone)).setPosition(new LatLng(latitude,longitude));
}
}
}
});
}
第三张地图的XML,仅显示设备位置的地图: 每次LocationListener回调OnLocationChanged方法时,都会调用toast消息,打印出当前的纬度和经度。
<com.google.android.gms.maps.MapView
android:id="@+id/mapLocalSetup"
android:layout_width="match_parent"
android:layout_height="250dp"
android:background="@color/mainText"/>
第三张地图的代码:
private void createMap(Bundle savedInstanceState) {
mapLocalSetup = (MapView) findViewById(R.id.mapLocalSetup);
mapLocalSetup.onCreate(savedInstanceState);
mapLocalSetup.onResume(); // needed to get the map to display immediately
try {
MapsInitializer.initialize(Singleton.ContextMainActivity);
} catch (Exception e) {
e.printStackTrace();
}
mapLocalSetup.getMapAsync(new OnMapReadyCallback() {
@Override
public void onMapReady(GoogleMap mMap) {
googleMap = mMap;
// For showing a move to my location button
googleMap.setMyLocationEnabled(true);
LatLng dispositivo = new LatLng(Singleton.user_latitude, Singleton.user_longitude);
// For zooming automatically to the location of the marker
CameraPosition cameraPosition = new CameraPosition.Builder().target(dispositivo).zoom(16).build();
googleMap.animateCamera(CameraUpdateFactory.newCameraPosition(cameraPosition));
}
});
}
正如您所看到的,所有三个代码实际上都是相同的,我只调用不同的ID。 更多信息:
第一个和第二个地图是碎片,第三个是发射器活动
正如我之前所说,第一个曾经工作正常,但其他两个没有。所以我所做的就是使用Google控制台生成另一个Google Maps API密钥,并使用google_maps_api_key.xml中的内置超链接。在我将其更改为新密钥后,第一个地图停止工作,并且恢复到旧密钥无法修复它。
我还尝试在Google控制台API上创建和整个新项目,并使用该新密钥,但问题仍然存在。
所以问题是,是否可以在单个应用程序上安装多个MapView。
- 如果我猜到任何事情,我会说,当我打电话给另一张地图时,其中一张地图正在运行的事实是一切都停止工作的原因,但我不知道如何“关闭”地图。
任何帮助都将不胜感激,非常感谢!