懒加载
因为viewpager的预加载机制,使得联网应用会多出内存以及网络的使用量,同时,在viewpager下使用高德地图,也会因此出现各种莫名其妙的问题,因此,需要使用懒加载的手段。
实现懒加载,只需继承fragment类然后重写与界面显示相关的方法即可。
public abstract class LazyFragment extends Fragment{
protected boolean isVisible;
@Override
public void setUserVisibleHint(boolean isVisibleToUser) {
//frahment从不可见到完全可见的时候,会调用该方法
super.setUserVisibleHint(isVisibleToUser);
if (getUserVisibleHint() && isInit){
isVisible = true;
onVisible();
}else {
isVisible = false;
isInit=false;
onInvisible();
}
}
protected abstract void lazyLoad();//懒加载的方法,在这个方法里面我们为Fragment的各个组件去添加数据
protected void onVisible(){
lazyLoad();
}
protected void onInvisible(){
}
}
isInit是一个在MapFragment里定义的bool型变量,用来判断高德地图所在的fragment是否已经初始化,如果不添加,那么点击viewpager里的tab跳转可能会出现空指针错误。
高德地图的具体实现
onCreateView()
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
Bundle savedInstanceState) {
View v = inflater.inflate(R.layout.fragment_map, container, false);
isFirstLoc = 1;
isInit = true;
mapView = (MapView) v.findViewById(R.id.map);
mapView.onCreate(savedInstanceState);// 此方法必须重写
screenWidth = ScreenUtils.getScreenWidth(getActivity());
screenHeight = ScreenUtils.getScreenHeight(getActivity());
setUpMapIfNeeded();
return v;
}
完成地图空间的初始化以及定位标识符的初始化,防止多次重复定位。高度与宽度用来后面的地图多标志聚合。
setUpMapIfNeeded()
private void setUpMapIfNeeded() {
((MainActivity) getActivity()).setFabVisible(0);//业务要求,读者可忽视
aMap = mapView.getMap();
uiSettings = aMap.getUiSettings();
aMap.setLocationSource(this);//设置定位监听,实现LocationSource的接口
aMap.setOnMarkerClickListener(this);// 设置点击marker事件监听器
aMap.setOnCameraChangeListener(this);// 对amap添加移动地图事件监听器
//是否显示定位按钮
uiSettings.setMyLocationButtonEnabled(true);
//设置缩放控件
uiSettings.setZoomGesturesEnabled(true);
//显示比例尺控件
uiSettings.setScaleControlsEnabled(true);
uiSettings.setZoomControlsEnabled(true);
//显示定位层并可以触发定位事件
aMap.setMyLocationEnabled(true);
//开始定位
location();
}
完成地图一些基本的参数配置。
location()
private void location() {
Log.d("定位测试", "location方法已经执行");
//初始化定位
aMapLocationClient = new AMapLocationClient(getActivity());
//设置定位回调监听
aMapLocationClient.setLocationListener(this);
//初始化定位参数
aMapLocationClientOption = new AMapLocationClientOption();
//设置定位模式为Hight_Accuracy高精度模式,Battery_Saving为低功耗模式,Device_Sensors是仅设备模式
aMapLocationClientOption.setLocationMode(AMapLocationClientOption.AMapLocationMode.Hight_Accuracy);
//设置是否返回地址信息(默认返回地址信息)
aMapLocationClientOption.setNeedAddress(true);
//设置是否只定位一次,默认为false
aMapLocationClientOption.setOnceLocation(false);
//设置是否强制刷新WIFI,默认为强制刷新
aMapLocationClientOption.setWifiActiveScan(true);
//设置是否允许模拟位置,默认为false,不允许模拟位置
aMapLocationClientOption.setMockEnable(false);
//设置定位间隔,单位毫秒,默认为2000ms
aMapLocationClientOption.setInterval(10000);
//给定位客户端对象设置定位参数
aMapLocationClient.setLocationOption(aMapLocationClientOption);
//启动定位
aMapLocationClient.startLocation();
}
配置定位参数并开始定位。
onLocationChanged()
public void onLocationChanged(AMapLocation aMapLocation) {
//Log.d("定位回掉方法测试",aMapLocation.toString());
if (aMapLocation != null) {
if (aMapLocation.getErrorCode() == 0) {
//可在其中解析amapLocation获取相应内容。
lat = aMapLocation.getLatitude();//获取纬度
lon = aMapLocation.getLongitude();//获取经度
//获取定位时间
SimpleDateFormat df = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
Date date = new Date(aMapLocation.getTime());
df.format(date)