这里只是简单的继承了一下BaseFragment,然后就是DataBinding的绑定。
② Navigation绑定
然后我们需要在nav_graph.xml中添加这个布局。
<fragment
android:id=“@+id/map_fragment”
android:name=“com.llw.mvvm.ui.fragment.MapFragment”
android:label=“map_fragment”
tools:layout=“@layout/map_fragment” />
这里配置了,那么底部的菜单同样要配置,毕竟我们是通过菜单去控制Fragment的切换的,打开navigation_menu.xml,在里面添加一个item,代码如下:
<item
android:id=“@+id/map_fragment”
android:icon=“@mipmap/ic_map”
android:title=“地图” />
这个图标可以去我的源码里面去找,或者自己去网上找一个也行。
下面进入到HomeActivity中去配置,配置切换菜单时的Fragment布局改变,如下图所示:
③ Fragment中地图生命周期绑定
要显示地图需要将地图的生命周期与Fragment的生命周期绑定起来,如下图所示:
如果你是线上的项目你需要在隐私政策中引入高德SDK的说明,然后在MapFragment中绑定地图的生命周期。
@Override
public void onSaveInstanceState(@NonNull @NotNull Bundle outState) {
super.onSaveInstanceState(outState);
binding.mapView.onSaveInstanceState(outState);
}
@Override
public void onResume() {
super.onResume();
binding.mapView.onResume();
}
@Override
public void onPause() {
super.onPause();
binding.mapView.onPause();
}
@Override
public void onDestroy() {
super.onDestroy();
binding.mapView.onDestroy();
}
下面运行一下:
现在只是显示了地图,但是并没有定位到我当前所在地,这当然是不行的。
显示当前所在地则需要定位权限,之前在AndroidManifest.xml中已经配置好了,下面则需要在代码中动态请求。
① 定位动态权限申请
在上一篇文章中写过一个PermissionUtils类,这里给这个类再加一点东西进去,在PermissionUtils中增加如下代码:
public static final String LOCATION = Manifest.permission.ACCESS_FINE_LOCATION;
public static final int REQUEST_LOCATION_CODE = 1003;
然后在getPermissionRequestCode方法中增加一个case,如下图所示:
下面就是在HomeActivity中请求动态权限了,在HomeActivity中新增如下方法:
/**
- 请求定位权限
*/
private void requestLocation() {
if (isAndroid6()) {
if (!hasPermission(PermissionUtils.LOCATION)) {
requestPermission(PermissionUtils.LOCATION);
}
} else {
showMsg(“您无需动态请求权限”);
}
}
然后在initView方法中调用它,如下图所示:
② 地图定位当前所在地
下面回到MapFragment,新增如下代码:
private static final String TAG = MapFragment.class.getSimpleName();
/**
- 初始化地图
*/
private void initMap() {
//初始化地图控制器对象
AMap aMap = binding.mapView.getMap();
// 设置为true表示显示定位层并可触发定位,false表示隐藏定位层并不可触发定位,默认是false
aMap.setMyLocationEnabled(true);
MyLocationStyle style = new MyLocationStyle();//初始化定位蓝点样式类myLocationStyle.myLocationType(MyLocationStyle.LOCATION_TYPE_LOCATION_ROTATE);//连续定位、且将视角移动到地图中心点,定位点依照设备方向旋转,并且会跟随设备移动。(1秒1次定位)如果不设置myLocationType,默认也会执行此种模式。
style.myLocationType(MyLocationStyle.LOCATION_TYPE_LOCATE) ;//定位一次,且将视角移动到地图中心点。
aMap.setMyLocationStyle(style);//设置定位蓝点的Style
aMap.getUiSettings().setMyLocationButtonEnabled(true);//设置默认定位按钮是否显示,非必需设置。
aMap.setMyLocationEnabled(true);// 设置为true表示启动显示定位蓝点,false表示隐藏定位蓝点并不进行定位,默认是false。
//设置SDK 自带定位消息监听
aMap.setOnMyLocationChangeListener(this);
}
@Override
public void onMyLocationChange(Location location) {
// 定位回调监听
if(location != null) {
Log.e(TAG, "onMyLocationChange 定位成功, lat: " + location.getLatitude() &