我正在使用一个带有标签视图寻呼机布局的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>
内部碎片:
public class HomeFragment extends Fragment implements OnMapReadyCallback, MapViewUpdateListener {
private GoogleMap mGoogleMap;
在onCreateView()
内:
SupportMapFragment mapFragment = ((SupportMapFragment) getChildFragmentManager().findFragmentById(R.id.map));
mapFragment.getMapAsync(this);
在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
内(用于监听后台服务的位置更新)
@Override
public void pointTo(Location location) {
Marker currentLocationMarker = mGoogleMap
.addMarker(new MarkerOptions()
.position(new LatLng(location.getLatitude(),location.getLongitude()))
.icon(BitmapDescriptorFactory
.defaultMarker(BitmapDescriptorFactory.HUE_ORANGE)));
}
}
正在加载地图onMapReady(GoogleMap googleMap)
正在调用,我将googleMap
存储到全局变量中以供将来使用。问题是当pointTo(Location location)
从服务调用时,mGoogleMap
在此处发现了null。但是mGoogleMap
被调用时会初始化onMapReady(GoogleMap googleMap)
。
我尝试过几种方式,包括使用MapView
而不是SupportMapFragment
。但是没有提出任何解决方案!
解决此问题的任何线索或解决方法? TIA。
解
经过多种方式尝试后终于得到了稳定的解决方案。我已从HomeFragment中删除MapViewUpdateListener
并实施LocalBroadCastReceiver
以从服务接收更新。实际上,我已将LocalBroadCastReceiver
中的现有HomeActivity
移除,并将其放入HomeFragment
。 LocalBroadCastReceiver
HomeFragment
被mGoogleMap
解雇时,我可以使用现有的HomeFragment
而无需任何NPE。
但是,我仍然不知道为什么位置更新通过接口获取实例变量的NPE。我想,我将MapViewUpdateListener
初始化为HomeFragment
的方式可能存在一些问题。可能是我通过类型转换获得的HomeFragment
对象返回一个新的{{1}}而不是现有的{{1}}! (但很难相信会发生这种情况!)
答案 0 :(得分:0)
你这里有竞争条件。尝试在pointTo
方法中设置标记(您已经这样做了)但null
检查mGoogleMap
是否为null
。
此外,如果您收到位置更新(onMapReady
在[{1}}后调用{}}更新标记pointTo
y(包含变量onMapRead
和{{1})后谷歌地图已准备就绪当调用pointTo方法时。
所以,你pointTo方法可能如下所示:
latitude
在地图准备就绪中执行此操作:
longitude