在viewPager里使用高德地图

本文介绍了在ViewPager中使用高德地图时如何实现懒加载,避免内存和网络资源浪费,解决由此引发的问题。通过自定义MapFragment,设置isInit标志来判断地图是否已初始化,关键方法包括onCreateView()、setUpMapIfNeeded()、location()、onLocationChanged()、addMarkerToMap()。此外,文章还提供了整体代码示例,特别强调在多点聚合时,必须每次循环声明markerOptions以避免错误。
摘要由CSDN通过智能技术生成

懒加载

因为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)
  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值