Не удается анимировать действительный геопункт по нажатию кнопки
Одна часть приложения, которое я делаю, требует карты 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
функции, чтобы выбрать первый адрес списка результатов с координатами.