MapView不渲染地图,但显示位置和标记

时间:2017-04-09 14:37:37

标签: java android xml google-maps google-maps-android-api-2

我有一个应用程序,它使用谷歌地图API来显示设备的位置,并向用户显示一堆标记。我的代码没有出错,整个应用程序运行正常,包括GPS位置跟踪。

我的问题是MapView不呈现实际的地图背景。我的意思是街道,街道名称等,但它呈现设备的位置(带有蓝点),我面对的方向(蓝点附近有蓝色箭头)和所有标记(我是从dinList创建一个ArrayList)。

问题可能是我在应用程序上有多个地图。

我提供了三个截图,每个地图实例之一,供你们分析,并分别在下面提供每个地图的java代码和XML。

图片:http://imgur.com/a/AFiQ6

第一张图片代码和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。

- 如果我猜到任何事情,我会说,当我打电话给另一张地图时,其中一张地图正在运行的事实是一切都停止工作的原因,但我不知道如何“关闭”地图。

任何帮助都将不胜感激,非常感谢!

0 个答案:

没有答案