Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/google-maps/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Android 虽然调用了onMapReady,但GoogleMap正在变为null_Android_Google Maps_Android Fragments - Fatal编程技术网

Android 虽然调用了onMapReady,但GoogleMap正在变为null

Android 虽然调用了onMapReady,但GoogleMap正在变为null,android,google-maps,android-fragments,Android,Google Maps,Android Fragments,我正在使用一个android应用程序,它有选项卡式的查看页面布局。我必须在viewpager的第一个屏幕上显示地图。映射包含在活动的片段中(AppCompatActivity->Fragment->map)。该应用程序有一项服务,用于在需要时更新地图 片段布局: <?xml version="1.0" encoding="utf-8"?> <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/andr

我正在使用一个android应用程序,它有选项卡式的查看页面布局。我必须在viewpager的第一个屏幕上显示地图。映射包含在活动的片段中(AppCompatActivity->Fragment->map)。该应用程序有一项服务,用于在需要时更新地图

片段布局:

<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
            android:layout_width="match_parent"
            android:layout_height="match_parent">

<fragment
    android:id="@+id/map"
    class="com.google.android.gms.maps.SupportMapFragment"
    android:layout_width="match_parent"
    android:layout_height="match_parent"/>

</RelativeLayout>
内部
onCreateView()

onMapReady

@Override
public void onMapReady(GoogleMap googleMap) {
    mGoogleMap = googleMap;
            theGoogleMap.setMapType(GoogleMap.MAP_TYPE_HYBRID);
    googleMap.setMyLocationEnabled(true);
    googleMap.setTrafficEnabled(true);
    googleMap.setIndoorEnabled(true);
    googleMap.setBuildingsEnabled(true);
    googleMap.getUiSettings().setZoomControlsEnabled(true);
}
内置
MapViewUpdateListener
(用于侦听后台服务的位置更新)

当map在mapready(GoogleMap-GoogleMap)上加载
时,
被调用,我将
GoogleMap
存储到一个全局变量中以备将来使用。问题是当从服务调用
pointTo(Location-Location)
get时,
mGoogleMap
在此处发现null。但是当调用onMapReady(GoogleMap GoogleMap)时,
mGoogleMap
被初始化

我已经尝试了几种方法,包括使用
MapView
而不是使用
SupportMapFragment
。但是没有想出任何解决办法

有什么线索或解决方法来解决这个问题吗?蒂亚

解决方案

经过几次尝试,最终得到了一个稳定的解决方案。我已经从HomeFragment中删除了
MapViewUpdateListener
,并实现了一个
LocalBroadCastReceiver
来接收来自服务的更新。实际上,我已经从
HomeActivity
中删除了现有的
LocalBroadCastReceiver
,并将其放入
HomeFragment
中。当
LocalBroadCastReceiver
HomeFragment
中被激发时,我可以使用现有的
mGoogleMap
而不使用任何NPE


但是,我仍然不知道为什么位置更新通过接口get NPE传递给实例变量。我想,我将
HomeFragment
初始化为
MapViewUpdateListener
的方式可能有一些问题。可能是我通过类型转换得到的
HomeFragment
对象返回一个新的
HomeFragment
而不是现有的!!!(但很难相信会发生这种情况!)

你在这里有比赛条件。尝试在
pointTo
方法中设置标记(您已经这样做了),但要让
null
检查
mGoogleMap
是否为
null
。 此外,如果在您收到位置更新后google地图已准备就绪(
onMapReady
pointTo
后被调用),则在
onMapRead
y内更新标记(当调用pointTo方法时,使用变量
纬度
经度

所以,您指向的方法可以如下所示:

   @Override
 public void pointTo(Location location) {
        if(mGoogleMap!=null){
        Marker currentLocationMarker = mGoogleMap
                  .addMarker(new MarkerOptions()
                  .position(new 
                   LatLng(location.getLatitude(),location.getLongitude()))
                 .icon(BitmapDescriptorFactory
                 .defaultMarker(BitmapDescriptorFactory.HUE_ORANGE)));
     }
 }
     else{
       latitude=location.latitude;//or whatever property is called
       longitude=location.longitude;;//or whatever property is called
      }
 }
在map ready中,执行以下操作:

    mGoogleMap = googleMap;
    theGoogleMap.setMapType(GoogleMap.MAP_TYPE_HYBRID);
    googleMap.setMyLocationEnabled(true);
    googleMap.setTrafficEnabled(true);
    googleMap.setIndoorEnabled(true);
    googleMap.setBuildingsEnabled(true);
    googleMap.getUiSettings().setZoomControlsEnabled(true);

   if(latitude!=null && longitude!=null){

      //Insert marker here on map because we have map ready and latitude and longitude also
   }
 }

您在这里有竞态条件。尝试在
pointTo
方法内设置标记(您已经这样做了),但是让
null
检查
mGoogleMap
是否为
null
。 此外,如果在您收到位置更新后google地图已准备就绪(
onMapReady
pointTo
后被调用),则在
onMapRead
y内更新标记(当调用pointTo方法时,使用变量
纬度
经度

所以,您指向的方法可以如下所示:

   @Override
 public void pointTo(Location location) {
        if(mGoogleMap!=null){
        Marker currentLocationMarker = mGoogleMap
                  .addMarker(new MarkerOptions()
                  .position(new 
                   LatLng(location.getLatitude(),location.getLongitude()))
                 .icon(BitmapDescriptorFactory
                 .defaultMarker(BitmapDescriptorFactory.HUE_ORANGE)));
     }
 }
     else{
       latitude=location.latitude;//or whatever property is called
       longitude=location.longitude;;//or whatever property is called
      }
 }
在map ready中,执行以下操作:

    mGoogleMap = googleMap;
    theGoogleMap.setMapType(GoogleMap.MAP_TYPE_HYBRID);
    googleMap.setMyLocationEnabled(true);
    googleMap.setTrafficEnabled(true);
    googleMap.setIndoorEnabled(true);
    googleMap.setBuildingsEnabled(true);
    googleMap.getUiSettings().setZoomControlsEnabled(true);

   if(latitude!=null && longitude!=null){

      //Insert marker here on map because we have map ready and latitude and longitude also
   }
 }

“问题是当从服务调用pointTo(Location Location)时”——服务不能调用活动或片段上的方法,除非您做错了什么。此侦听器具体在哪里,调用的确切程度如何,以及如何确保在
onMapReady()之前不会调用它
被称为?@commonware实际上,
HomeActivity
使用
LocalBroadCastReceiver
服务
获取位置更新。然后
HomeActivity
使用
MapViewUpdateListener
指向(位置)传递位置更新
方法。服务没有直接使用Activity/Fragment方法。好的。您如何确保在
onMapReady()之前不会调用
pointTo()
?我在这里没有做任何特殊的事情。我只是调试并登录到logcat,发现
onMapReady()
在调用
pointTo()
之前被调用。@commonware有什么建议吗?“问题是从服务调用pointTo(位置)时”--服务无法调用活动或片段上的方法,除非您做错了什么。此侦听器的确切位置、调用它的确切方式以及如何确保在
onMapReady()之前不会调用它
被称为?@commonware实际上,
HomeActivity
使用
LocalBroadCastReceiver
服务
获取位置更新。然后
HomeActivity
使用
MapViewUpdateListener
指向(位置)传递位置更新
方法。服务没有直接使用Activity/Fragment方法。好的。您如何确保在
onMapReady()之前不会调用
pointTo()
?我在这里没有做任何特殊的事情。我只是调试并登录到logcat,发现
onMapReady()在调用
pointTo()
之前调用了
。@commonware有什么建议吗?
onMapReady()
只调用一次,只要有新位置可用,就会调用
pointTo()
。如果
mGoogleMap
pointTo()
中为空,则
onMapReady()
不会被调用两次。因此没有办法在
onMapReady()
中使用存储在
pointTo()
方法中的lat、lang。googleMap在onMapReady中为null?如果发生这种情况,我不知道
onMapReady()
只被调用一次并且
pointTo()每当新位置可用时都会调用
。如果
mGoogleMap
pointTo()
中为空,则不会调用
onMapReady()
    mGoogleMap = googleMap;
    theGoogleMap.setMapType(GoogleMap.MAP_TYPE_HYBRID);
    googleMap.setMyLocationEnabled(true);
    googleMap.setTrafficEnabled(true);
    googleMap.setIndoorEnabled(true);
    googleMap.setBuildingsEnabled(true);
    googleMap.getUiSettings().setZoomControlsEnabled(true);

   if(latitude!=null && longitude!=null){

      //Insert marker here on map because we have map ready and latitude and longitude also
   }
 }