2017-04-01 7 views
0

응용 프로그램이 실행되는 동안 내 Google지도 활동에 마커를 구현하려고했습니다. 일부 미리 정의 된 "위치"개체가 있으며 사용자의 "현재 위치"에 마커가 있습니다.앱 실행 중지도에 마커 추가 성공하지 못했습니다.

, 더 마커가 추가되지 얻을 (하나에서 거기에 내가 위치 개체의 마커가 표시되어야하는 현재 위치의 range을 변경려고하는 SeekBar를 사용하지만, SeekBar 변경에 아무 일도 발생하지 않습니다 현재 위치). LatLng들에 대한

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) { 
    } 
} 
+0

정말 오류가 표시됩니까? 마커가 보이지 않습니까? –

+0

@Kirankumar Zinzuvadia 예 죄송합니다. 마커가 표시되지 않습니다. 오류가 없습니다. – Ryuzaki

답변

0

귀하의 addinMarkersInRange() 방법은 추가하고 마커 : 원치 않는 추가 코드에 대한 사과, 나는이 내 MapsActivity.java입니다 onConnected(), onSeekBarChangedListener()onMapReady()

이다에서 가장 중요한 부분은 볼 생각 locations 배열에 있습니다. 따라서 addingMarkersInRange을 호출하기 전에 배열 locations에 추가해야합니다. 그러나 배열에 추가 할 수 없으므로 위치를 List으로 변경하십시오.

SeekBar 개체에 수신기를 설정하지 않았습니다. 당신의에서 onCreate()에서 이렇게 같은 OnSeekBarChangeListener을 설정하십시오 :

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

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

그러나 위치 배열은 비어 있지 않습니다! 나는 당신을 얻지 못한다 ... 내가 어플리케이션을 실행할 때 현재 위치에 마커가 1 개 밖에 없다. 검색 바를 변경하면 배열의 마커도 표시되지 않습니다. – Ryuzaki

+0

@Ryuzaki @Ryuzaki 어리석은 것처럼 들리지만 위치 배열에 LatLng가 서로 가깝기 때문에 확대하려고 시도 했습니까? – BhalchandraSW

+0

하하, 네, 그게 문제가 아니란 걸 확신합니다. :) – Ryuzaki

0

나는()는 addingMarkersInRange에 문제가 생각합니다. 하지만 계속 진행하십시오. 먼저 seekbar에 리스너를 설정하십시오. 그런 다음 seekbar의 최대 값을 설정하십시오. 이제 처음에 zero를 전달하는 대신 addingMarkersInRange (1)을 호출합니다.

이제 막대 변경을 검색하는 동안 onProcess 변경에서 isfromUser 플래그를 사용합니다.

그리고 onCameraChange()를 제거하십시오. & for 루프 외부에 배치하십시오. 그리고 latlongbound를 사용하여 카메라 줌 레벨을 애니메이션으로 만듭니다.

이제 실행 된 UI 변경 사항을 확인하십시오!