Не удается анимировать действительный геопункт по нажатию кнопки

Одна часть приложения, которое я делаю, требует карты Google. Я хочу, чтобы пользователь мог набрать в текстовом редакторе некоторую строку поиска, а затем нажать кнопку поиска, и карта будет анимирована до первого результата.

Когда я нажимаю кнопку, приложение ищет и берет первый результат и помещает его в геопункт, чтобы часть программы работала. Но когда я пытаюсь анимировать к этому моменту, приложение вылетает.

Вот функция onCreate, в которой я успешно перемещаюсь в местоположение "Dalvík, Исландия".

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 ".

Есть идеи, что не так?

2 ответа

Решение

Я нашел ответ.

Проблема, вызывающая это была эта линия

mapView.invalidate();

Вы не проверяете правильную переменную для нулевого значения:

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

должно быть

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

Кроме того, вы хотите позвонить в geoCoder.getFromLocationName метод вне потока пользовательского интерфейса, так как это может занять много времени. Используйте AsyncTask для этого, например.

Наконец, даже если вы получите список адресов, они не гарантированно имеют широту и долготу. Использовать hasLatitude а также hasLongitude функции, чтобы выбрать первый адрес списка результатов с координатами.

Другие вопросы по тегам