2012-11-17 1 views
1

응용 프로그램의 일부분에는 Google지도가 필요합니다. 사용자가 edittext에 검색 문자열을 입력 한 다음 검색 버튼을 누르면지도가 첫 번째 결과로 움직이게 할 수 있습니다.버튼 클릭시 유효한 지오 포인트에 애니메이션을 적용 할 수 없습니다.

버튼을 누르면 응용 프로그램이 첫 번째 결과를 검색하고이를 geopoint에 넣음으로써 프로그램의 일부가 작동합니다. 하지만 그 지점에 애니메이션을 적용하려고하면 응용 프로그램이 충돌합니다.

다음은 "Dalvík, Iceland"위치로 성공적으로 이동하는 onCreate 기능입니다.

public class LocationPicker extends MapActivity { 
    static GeoPoint point; 
    static MapController mc; 
    static MapView mapView; 
    private EditText location; 
    @Override 
    public void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     setContentView(R.layout.activity_location_picker); 
     MapView mapView = (MapView) findViewById(R.id.mapview); 
     mapView.setBuiltInZoomControls(true); 
     location = (EditText)findViewById(R.id.locationString); 
     mc = mapView.getController(); 
     String tmp = "Dalvík, Iceland"; 
     try { 
      point = searchLocation(tmp); 
     } catch (IOException e) { 
      // TODO Auto-generated catch block 
      e.printStackTrace(); 
     } 
     mc.animateTo(point); 
     mc.setZoom(14); 
     MapOverlay mapOverlay = new MapOverlay(); 
     List<Overlay> listOfOverlays = mapView.getOverlays(); 
     listOfOverlays.clear(); 
     listOfOverlays.add(mapOverlay); 

     mapView.invalidate(); 

    } 

버튼 클릭에 대한 코드가 명확하고 System.out.println (포인트)이 유효한 포인트를 인쇄합니다. 하지만 여전히 버튼을 클릭하면 응용 프로그램이 충돌합니다. 다음과 같이

public void search(View v) throws IOException{ 
     GeoPoint tmpPoint = searchLocation(location.getText().toString()); 
     System.out.println(tmpPoint); 
     if(tmpPoint != null){ 
      mc.animateTo(tmpPoint); 
      mapView.invalidate(); 
     } 
    } 

그리고 searchLocation 기능은 다음과 같습니다

public GeoPoint searchLocation (String searchString) throws IOException{ 
     Geocoder geo = new Geocoder(this); 
     List<Address> addr; 
     addr = geo.getFromLocationName(searchString, 10); 
     if(!addr.isEmpty()){ 
        Address loc = addr.get(0); 
        GeoPoint point = new GeoPoint((int) (loc.getLatitude() * 1E6), 
         (int) (loc.getLongitude() * 1E6)); 
        return point; 
     } 
     else { 
      return null; 
     } 
} 

그래서 명확하게 onclick을 "검색"기능에서 뭔가 잘못하고있는 중이 야 summerize 할 수 있습니다.

어떤 아이디어가 잘못 되었나요?

답변

0

답변을 찾았습니다.

문제는이 라인

mapView.invalidate()의 원인이었다;

0

당신은 널 (null) 값에 대한 올바른 변수 확인되지 않습니다

if(point != null){ 
     mc.animateTo(tmpPoint); 
     mapView.invalidate(); 
    } 

if(tmpPoint!= null){ 
     mc.animateTo(tmpPoint); 
     mapView.invalidate(); 
    } 

Additionnally해야을, 당신이이 할 수있는 UI 스레드 외부 geoCoder.getFromLocationName 메서드 호출을 만들고 싶어 시간 소모적이다. 예를 들어 AsyncTask을 사용하십시오.

마지막으로 주소 목록을 얻더라도 위도와 경도가 보장되지 않습니다. hasLatitudehasLongitude 함수를 사용하여 좌표가있는 결과 목록의 첫 번째 주소를 선택하십시오.

+0

사실, 실제로 방금 변수 이름이 기존 변수 지점과 충돌하지 않도록 변경했습니다. 결과의 위도와 경도를 인쇄하고 유효한 점을 보여주는 디버깅을 일부 만들었습니다. 그래서 내가 염려하는 한 내 tmpPoint는 유효한 geoPoint이지만 애니메이션을 만들려고 할 때 프로그램이 계속 충돌합니다. –