我正在创建一个带有谷歌地图和以用户位置为中心的圆半径的应用程序。我希望用户用旋转器选择所需的圆半径(1-10 公里半径)。但是当我使用微调器中的值时,半径圆不会出现。
对于位置,我可以通过以下方式获取显示我外观的蓝点:map.setMyLocationEnabled(true);我可以手动输入 map 放大的位置。但是,当我尝试放大并在设备位置设置圆心时,出现 nullpointerexception 错误。下面是我的位置代码, toast 只是为了让我看到我获得了实际位置。
private void getDeviceLocation() {
if (ActivityCompat.checkSelfPermission(this, Manifest.permission.ACCESS_FINE_LOCATION)
!= PackageManager.PERMISSION_GRANTED) {
ActivityCompat.requestPermissions(this, new String[]
{Manifest.permission.ACCESS_FINE_LOCATION}, PERMISSIONS_REQUEST_ACCESS_FINE_LOCATION);
return;
}
Task<Location> task = mFusedLocationClient.getLastLocation();
task.addOnSuccessListener(MainActivity.this, new OnSuccessListener<Location>() {
@Override
public void onSuccess(Location location) {
if (location != null) {
currentLocation = location;
Toast.makeText(MainActivity.this, "Current Position " + currentLocation.getLongitude(), Toast.LENGTH_LONG).show(); //Just to make sure we have a value
SupportMapFragment supportMapFragment = (SupportMapFragment) getSupportFragmentManager()
.findFragmentById(R.id.map2);
supportMapFragment.getMapAsync(MainActivity.this);
}
}
});
}
然后我使用 userPosition 进行 map 放大并设置圆心
public void onMapReady(GoogleMap map) {
LatLng userPosition = new LatLng(currentLocation.getLatitude(), currentLocation.getLongitude());
mGoogleMap = map;
map.setMyLocationEnabled(true);
map.animateCamera(CameraUpdateFactory.newLatLngZoom(userPosition, 10f));
map.addCircle(new CircleOptions()
.center(userPosition)
.radius(mapRadius)
.strokeColor(0x330073FF)
.fillColor(0x330073FF)
.strokeWidth(2));
map.getUiSettings().setZoomControlsEnabled(true);
map.getUiSettings().setMyLocationButtonEnabled(true);
}
但在这里我在 userPosition: java.lang.NullPointerException: Attempt to invoke virtual method 'double android.location.Location.getLatitude()' 行上收到错误 userPosition: java.lang.NullPointerException: Attempt to invoke virtual method 'double android.location.Location.getLatitude()' on a null object reference 在 com.example.test.MainActivity.onMapReady(MainActivity.java:362)。
我从教程中获得了代码,它似乎对他们有用,并尝试了许多不同的教程以及略有不同的代码,所以不确定我做错了什么。我尝试过搜索并知道其他人也有类似的问题,但仍然没有成功。
至于半径,当我设置手动位置并写入它时效果很好,如果我自己以米为单位写入半径,则效果很好。但是,如果我尝试使用微调器和 mapRadius 值,则当我运行模拟器时,半径圆根本不会显示。这是 onCreate 中的代码
spinnerRadius = findViewById(R.id.spinner_radius);
ArrayAdapter<CharSequence> spinnerAdapter = ArrayAdapter.createFromResource(this,
R.array.spinner_radius_option, android.R.layout.simple_spinner_item);
spinnerRadius.setAdapter(spinnerAdapter);
spinnerRadius.setOnItemSelectedListener(new AdapterView.OnItemSelectedListener() {
@Override
public void onItemSelected(AdapterView<?> parent, View view, int position, long id) {
mapRadiusInput = parent.getItemAtPosition(position).toString();
mapRadius = Double.parseDouble(mapRadiusInput)*1000; //converting to meters
Toast.makeText(MainActivity.this, ""+mapRadius, Toast.LENGTH_LONG).show();
}
我是编程和 Android 方面的初学者,我在这两个问题上花了很多时间,如果它很容易解决,我也不会感到惊讶。任何帮助或指示将不胜感激。
最佳答案
添加圆圈时,将返回值 (Circle
) 保存在字段变量 Circle myCircle
中。
然后在 onItemSelected
中使用该值(以米为单位)更新圆半径。
因此,首先将变量声明为类字段变量(稍后用于范围可见性)。我假设这一切都在一个类中 - 如果不是,您需要使 onItemSelected
回调实例可以访问此变量。
private Circle myCircle;
然后在添加圆圈时,保存它:
myCircle = map.addCircle(new CircleOptions()
.center(userPosition)
.radius(mapRadius)
.strokeColor(0x330073FF)
.fillColor(0x330073FF)
.strokeWidth(2));
并在您的onItemSelected
中,更新圆圈(以米为单位)
myCircle.setRadius(mapRadius);
这是另一个显示相同内容的示例:https://stackoverflow.com/a/38454501/2711811
关键是在创建Circle
时保存它。正如您从 API 中看到的,通过 Circle
引用,还可以使用其他 setter。
关于java - Android studio 获取 map 的最后已知位置并使用微调器设置圆半径,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59610106/