在应用程序运行失败时在地图中添加标记

时间:2017-04-01 14:09:03

标签: android google-maps google-maps-markers marker

我一直在尝试在应用程序运行时在我的Google地图活动中实现标记。有一些预定义的"位置"对象,并在"当前位置有一个标记"用户。

使用SeekBar,我尝试更改应显示位置对象标记的当前位置的range,但是在更改SeekBar时没有任何反应(没有标记被添加,只有一个在当前位置)。对于不需要的额外代码表示道歉,我认为最重要的部分是onConnected()onSeekBarChangedListener()onMapReady()

这是我的MapsActivity.java:

public class MapsActivity extends FragmentActivity implements OnMapReadyCallback, GoogleApiClient.ConnectionCallbacks, GoogleApiClient.
OnConnectionFailedListener, OnSeekBarChangeListener {

    private GoogleApiClient googleApiClient;
    private SeekBar rangeSeekBar;
    private GoogleMap mMap;
    private Intent intent;
    private Location currentLocation;
    private Location[] locations;
    private double range;

    Location locationOne;
    Location locationTwo;
    Location locationThree;
    Location locationFour;
    Location locationFive;
    Location locationSix;
    Location locationSeven;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_maps);

        locationOne = new Location("");
        locationTwo = new Location("");
        locationThree = new Location("");
        locationFour = new Location("");
        locationFive = new Location("");
        locationSix = new Location("");
        locationSeven = new Location("");

        locationOne.setLatitude(10.1399);
        locationOne.setLongitude(76.1784);

        locationTwo.setLatitude(10.2244);
        locationTwo.setLongitude(76.1978);

        locationThree.setLatitude(9.6175);
        locationThree.setLongitude(76.4301);

        locationFour.setLatitude(9.5987);
        locationFour.setLongitude(76.3116);

        locationFive.setLatitude(9.6175);
        locationFive.setLongitude(76.4301);

        locationSix.setLatitude(9.6737);
        locationSix.setLongitude(76.5610);

        locationSeven.setLatitude(15.5152);
        locationSeven.setLongitude(73.8565);

        locations = new Location[]{
            locationOne,
            locationTwo,
            locationThree,
            locationFour,
            locationFive,
            locationSix,
            locationSeven
        };

        rangeSeekBar = (SeekBar)findViewById(R.id.rangeSeekBar);
        rangeSeekBar.setProgress(0);

        SupportMapFragment mapFragment = (SupportMapFragment) getSupportFragmentManager()
            .findFragmentById(R.id.map);
        mapFragment.getMapAsync(this);
    }

    @Override
    protected void onStop() {
        super.onStop();
        googleApiClient.disconnect();
    }

    @Override
    public void onMapReady(GoogleMap googleMap) {
        mMap = googleMap;
        LatLng india = new LatLng(20.5937, 78.9629);
        mMap.moveCamera(CameraUpdateFactory.newLatLngZoom(india, 5));

        if(googleApiClient==null){
            googleApiClient  = new GoogleApiClient.Builder(this)
                .addConnectionCallbacks(this)
                .addOnConnectionFailedListener(this)
                .addApi(LocationServices.API)
                .build();
        }

        googleApiClient.connect();
    }

    @Override
    public void onConnected(@Nullable Bundle bundle) {

        if(ContextCompat.checkSelfPermission(MapsActivity.this, android.Manifest.permission.ACCESS_COARSE_LOCATION)!= PackageManager.PERMISSION_GRANTED){
            ActivityCompat.requestPermissions(MapsActivity.this,new String[]{android.Manifest.permission.ACCESS_COARSE_LOCATION},1);
        } else {
            currentLocation = LocationServices.FusedLocationApi.getLastLocation(googleApiClient);

            LatLng currentLoc = new LatLng(currentLocation.getLatitude(),currentLocation.getLongitude());
            mMap.addMarker(new MarkerOptions().position(currentLoc).title("Your current location"));
        }

        addingMarkersInRange(0);
    }

    public void addingMarkersInRange(double range){
        for(int i=0;i<locations.length;i++){
            if(currentLocation.distanceTo(locations[i])<range) {
                LatLng tempLatLng = new LatLng(locations[i].getLatitude(), locations[i].getLongitude());
                mMap.addMarker(new MarkerOptions().position(tempLatLng));
                mMap.moveCamera(CameraUpdateFactory.newLatLng(tempLatLng));
            }
        }
    }

    @Override
    public void onConnectionSuspended(int i) {
    }

    @Override
    public void onConnectionFailed(@NonNull ConnectionResult connectionResult) {
    }

    @Override
    public void onProgressChanged(SeekBar seekBar, int progress, boolean fromUser) {
        addingMarkersInRange(rangeSeekBar.getProgress()*700000);
    }

    @Override
    public void onStartTrackingTouch(SeekBar seekBar) {
    }

    @Override
    public void onStopTrackingTouch(SeekBar seekBar) {
    }
} 

2 个答案:

答案 0 :(得分:0)

您的addinMarkersInRange()方法仅在LatLng数组中为locations添加标记。因此,您需要在调用locations之前添加到addingMarkersInRange数组。但是,由于您无法添加到数组,请将位置更改为List,您应该很高兴。

您没有在SeekBar对象上设置侦听器。请在你的onCreate()中设置OnSeekBarChangeListener,如下所示:

// code you already have
rangeSeekBar = (SeekBar)findViewById(R.id.rangeSeekBar);
rangeSeekBar.setProgress(0);

// register event listener here
rangeSeekBar.setOnSeekBarChangeListener(this);

答案 1 :(得分:0)

我认为你在添加MarkersInRange()时遇到了问题。 但是,让我们继续前行, 首先将侦听器设置为seekbar。然后设置搜索栏的最大值。 现在最初调用AddingMarkersInRange(1)而不是传递零。

现在,当搜索栏更改时,在onProgress中使用isfromUser标志更改。

并删除onCameraChange()&amp;把它放在for循环之外。并使用latlongbound来设置相机缩放级别的动画。

现在运行并检查在UI上进行的任何更改......!