使用自定义支持片段将 getMap 替换为 getMapAsync
Replace getMap with getMapAsync with custom support fragment
正在尝试将我的 google 依赖项从 9.0.0 更新到 15.0.0。但是我必须更新
getMap();
和
getMapAsync();
因为getMap();在最新版本的 google 库中已弃用。
问题是我正在使用自定义片段加载视图。我这样做是因为我有 3 种不同的地图类型,可以根据用户选择将它们加载到地图视图中。但它不允许我在没有错误的情况下执行 getMapAsync。
这是我的代码:
private void setUpMapIfNeeded() {
if (mMapFragment == null) {
mMapFragment = new CustomSupportMapFragment();
mMapFragment.setOnMapCreatedListener(new CustomSupportMapFragment.MapViewCreatedListener() {
@Override
public void onMapCreated() {
boolean needUpdate = mMap == null;
mMap = mMapFragment.getMapAsync();
if (mMap != null)
setUpMap(needUpdate);
}
});
}
FragmentTransaction ft = getChildFragmentManager().beginTransaction();
ft.replace(R.id.map, mMapFragment);
ft.commit();
}
但我收到错误消息:
getMapAsync (OnMapReadyCallback) in SupportMapFragment cannot be applied to ()
所以我尝试添加 this, getContext() 像这样:
getMapAsync(this);
getMapAsync(getContext));
但两者都返回有关无法应用的错误。
有什么想法吗?抱歉,我对 java 的理解是新的,我正在学习。我已尝试在 Whosebug 和 google 中搜索此问题,但只能在使用常规 supportmapfragment 而不是自定义 supportmapfragment 时找到解决方案。
下面是我的setUpMap方法,如果对你的理解有帮助的话:
private void setUpMap(boolean needUpdate) {
boolean location_permission_granted = (ContextCompat.checkSelfPermission(getActivity(), Manifest.permission.ACCESS_FINE_LOCATION) == PackageManager.PERMISSION_GRANTED);
if (!location_permission_granted) {
requestPermissions(new String[]{Manifest.permission.ACCESS_FINE_LOCATION}, 200);
} else {
mMap.setMyLocationEnabled(true);
}
mMap.setOnCameraChangeListener(new GoogleMap.OnCameraChangeListener() {
@Override
public void onCameraChange(CameraPosition cameraPosition) {
if (LOAD_PARTICULAR_MAP == 1) {
if (cameraPosition.zoom > AppConstants.MAX_ZOOM) {
CameraUpdate upd = CameraUpdateFactory.newLatLngZoom(cameraPosition.target, AppConstants.MAX_ZOOM);
mMap.moveCamera(upd);
}
float maxZoom = 4f;
if (cameraPosition.zoom > maxZoom) {
mMap.animateCamera(CameraUpdateFactory.zoomTo(maxZoom));
return;
}
float minZoom = 0f;
if (cameraPosition.zoom < minZoom) {
mMap.animateCamera(CameraUpdateFactory.zoomTo(minZoom));
return;
}
}
}
});
mMap.setOnMapLongClickListener(this);
mMap.setOnMyLocationButtonClickListener(this);
mMap.setOnMapClickListener(this);
mMap.setOnMarkerDragListener(this);
mMap.setOnMarkerClickListener(this);
// mBtnMapType.setVisibility(View.VISIBLE);
mMap.getUiSettings().setScrollGesturesEnabled(true);
//mBtnLegend.setVisibility(View.VISIBLE);
//updateLegendButton();
updateMapType(mSettings.getMapType(GoogleMap.MAP_TYPE_TERRAIN));
/*mTileProvider = new TranslucentUrlTileProvider(AppConstants.SERVER_URL, AppConstants.SERVER_URL_FREE);
// mTileProvider.setPro(!mIsPro.showPurchaseDialog());
//mTileProvider.setOpacity(mOpacity);
mTileOverlay = mMap.addTileOverlay(new TileOverlayOptions().tileProvider(mTileProvider));*/
if (needUpdate)
if (LOAD_PARTICULAR_MAP != 4) {
gotoMyLocation();
}
// mMap.setOnMarkerClickListener(new GoogleMap.OnMarkerClickListener() {
// @Override
// public boolean onMarkerClick(Marker marker) {
// if (marker != null) {
// openGoogleMap(marker);
// return true;
// }
// return false;
// }
// });
switch (LOAD_PARTICULAR_MAP) {
case 1:
auroraOverMap();
mMap.animateCamera(CameraUpdateFactory.zoomTo(0f));
break;
case 2:
lightPollutionMap();
break;
case 3:
loadCloudMap();
break;
case 4:
highestValueView();
// mMap.animateCamera( CameraUpdateFactory.zoomTo( 12f ) );
break;
}
}
您无法通过调用
获得 GoogleMap
对象
mMap = mMapFragment.getMapAsync();
你应该使用这样的代码:
mMapFragment.getMapAsync(new OnMapReadyCallback() {
@Override
public void onMapReady(GoogleMap googleMap) {
mMap = googleMap;
}
});
其中mMap
是全局变量:
public class MainActivity extends AppCompatActivity {
private GoogleMap mMap;
...
在你得到 mMap
之后你可以用它来设置你的地图:
mMapFragment.getMapAsync(new OnMapReadyCallback() {
@Override
public void onMapReady(GoogleMap googleMap) {
mMap = googleMap;
if (mMap != null)
setUpMap(needUpdate);
}
});
另外,看看Official Tutorial。
正在尝试将我的 google 依赖项从 9.0.0 更新到 15.0.0。但是我必须更新
getMap();
和
getMapAsync();
因为getMap();在最新版本的 google 库中已弃用。
问题是我正在使用自定义片段加载视图。我这样做是因为我有 3 种不同的地图类型,可以根据用户选择将它们加载到地图视图中。但它不允许我在没有错误的情况下执行 getMapAsync。
这是我的代码:
private void setUpMapIfNeeded() {
if (mMapFragment == null) {
mMapFragment = new CustomSupportMapFragment();
mMapFragment.setOnMapCreatedListener(new CustomSupportMapFragment.MapViewCreatedListener() {
@Override
public void onMapCreated() {
boolean needUpdate = mMap == null;
mMap = mMapFragment.getMapAsync();
if (mMap != null)
setUpMap(needUpdate);
}
});
}
FragmentTransaction ft = getChildFragmentManager().beginTransaction();
ft.replace(R.id.map, mMapFragment);
ft.commit();
}
但我收到错误消息:
getMapAsync (OnMapReadyCallback) in SupportMapFragment cannot be applied to ()
所以我尝试添加 this, getContext() 像这样:
getMapAsync(this);
getMapAsync(getContext));
但两者都返回有关无法应用的错误。
有什么想法吗?抱歉,我对 java 的理解是新的,我正在学习。我已尝试在 Whosebug 和 google 中搜索此问题,但只能在使用常规 supportmapfragment 而不是自定义 supportmapfragment 时找到解决方案。
下面是我的setUpMap方法,如果对你的理解有帮助的话:
private void setUpMap(boolean needUpdate) {
boolean location_permission_granted = (ContextCompat.checkSelfPermission(getActivity(), Manifest.permission.ACCESS_FINE_LOCATION) == PackageManager.PERMISSION_GRANTED);
if (!location_permission_granted) {
requestPermissions(new String[]{Manifest.permission.ACCESS_FINE_LOCATION}, 200);
} else {
mMap.setMyLocationEnabled(true);
}
mMap.setOnCameraChangeListener(new GoogleMap.OnCameraChangeListener() {
@Override
public void onCameraChange(CameraPosition cameraPosition) {
if (LOAD_PARTICULAR_MAP == 1) {
if (cameraPosition.zoom > AppConstants.MAX_ZOOM) {
CameraUpdate upd = CameraUpdateFactory.newLatLngZoom(cameraPosition.target, AppConstants.MAX_ZOOM);
mMap.moveCamera(upd);
}
float maxZoom = 4f;
if (cameraPosition.zoom > maxZoom) {
mMap.animateCamera(CameraUpdateFactory.zoomTo(maxZoom));
return;
}
float minZoom = 0f;
if (cameraPosition.zoom < minZoom) {
mMap.animateCamera(CameraUpdateFactory.zoomTo(minZoom));
return;
}
}
}
});
mMap.setOnMapLongClickListener(this);
mMap.setOnMyLocationButtonClickListener(this);
mMap.setOnMapClickListener(this);
mMap.setOnMarkerDragListener(this);
mMap.setOnMarkerClickListener(this);
// mBtnMapType.setVisibility(View.VISIBLE);
mMap.getUiSettings().setScrollGesturesEnabled(true);
//mBtnLegend.setVisibility(View.VISIBLE);
//updateLegendButton();
updateMapType(mSettings.getMapType(GoogleMap.MAP_TYPE_TERRAIN));
/*mTileProvider = new TranslucentUrlTileProvider(AppConstants.SERVER_URL, AppConstants.SERVER_URL_FREE);
// mTileProvider.setPro(!mIsPro.showPurchaseDialog());
//mTileProvider.setOpacity(mOpacity);
mTileOverlay = mMap.addTileOverlay(new TileOverlayOptions().tileProvider(mTileProvider));*/
if (needUpdate)
if (LOAD_PARTICULAR_MAP != 4) {
gotoMyLocation();
}
// mMap.setOnMarkerClickListener(new GoogleMap.OnMarkerClickListener() {
// @Override
// public boolean onMarkerClick(Marker marker) {
// if (marker != null) {
// openGoogleMap(marker);
// return true;
// }
// return false;
// }
// });
switch (LOAD_PARTICULAR_MAP) {
case 1:
auroraOverMap();
mMap.animateCamera(CameraUpdateFactory.zoomTo(0f));
break;
case 2:
lightPollutionMap();
break;
case 3:
loadCloudMap();
break;
case 4:
highestValueView();
// mMap.animateCamera( CameraUpdateFactory.zoomTo( 12f ) );
break;
}
}
您无法通过调用
获得GoogleMap
对象
mMap = mMapFragment.getMapAsync();
你应该使用这样的代码:
mMapFragment.getMapAsync(new OnMapReadyCallback() {
@Override
public void onMapReady(GoogleMap googleMap) {
mMap = googleMap;
}
});
其中mMap
是全局变量:
public class MainActivity extends AppCompatActivity {
private GoogleMap mMap;
...
在你得到 mMap
之后你可以用它来设置你的地图:
mMapFragment.getMapAsync(new OnMapReadyCallback() {
@Override
public void onMapReady(GoogleMap googleMap) {
mMap = googleMap;
if (mMap != null)
setUpMap(needUpdate);
}
});
另外,看看Official Tutorial。