1

我正在制作的应用程序的一部分需要谷歌地图。我希望用户能够在edittext中输入一些搜索字符串,然后按下搜索按钮,地图将动画到第一个结果。

当我按下按钮时,应用程序搜索并获取第一个结果并将其放入一个地理点,以便程序的这一部分工作。但是当我尝试动画到那个点时,应用程序崩溃了。

这是我成功导航到“冰岛达尔维克”位置的 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(point) 打印有效点。但是当我单击按钮时,我的应用程序仍然崩溃。

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“搜索”功能中做错了什么。

有什么想法有什么问题吗?

4

2 回答 2

0

您没有检查正确的变量是否为空值:

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

应该

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

此外,您希望geoCoder.getFromLocationName在 UI 线程之外调用该方法,因为这可能很耗时。例如,使用 an AsyncTask

最后,即使您获得地址列表,也不能保证它们具有纬度和经度。使用hasLatitudehasLongitude函数选择结果列表的第一个地址和坐标。

于 2012-11-17T12:00:39.240 回答
0

我找到了答案。

导致这个的问题是这条线

mapView.invalidate();

于 2012-11-17T15:47:18.900 回答