如何刷新活动?地图视图刷新失败

时间:2010-05-03 06:17:09

标签: java android map android-activity

在实施了一些Android应用程序(包括多个Map活动)之后,我尝试在调用GPS侦听器的onLocationChanged()方法时刷新活动。

我不知道如何告诉地图活动自己刷新并显示新的坐标......

要存储的coords必须是全局值,以便位置监听器可以访问它。

在我的GPS类示例中(参见下面的代码)我刚刚更改了文本视图的文本....但是如何在地图视图中执行此操作?

private class MyLocationListener implements LocationListener {
    @Override
    public void onLocationChanged(Location loc) {
        final TextView tv = (TextView) findViewById(R.id.myTextView);
        if (loc != null) {
            tv.setText("Location changed : Lat: " + loc.getLatitude()
                            + " Lng: " + loc.getLongitude());
        }
    }

我认为这个问题的解决方案不会很困难,但我只需要开头; - )

整个应用程序应该像一个非常简单的导航系统。

如果有人可以帮助我一点点,那就太好了。)

2 个答案:

答案 0 :(得分:5)

您可以调用View :: invalidate()(http://developer.android.com/reference/android/view/View.html#invalidate()),因此View将使用View :: onDraw()方法重绘。要使用它,您应该将代码移动到View(例如MapView)到onDraw()方法。

答案 1 :(得分:0)

感谢答案,理论上听起来很棒。但我在地图上没有检索到更新...评论功能为我的代码提供了小空间,这就是我在这里发布的原因:

public class NavigationActivity extends MapActivity {

//  static GeoPoint posCar;
//  static GeoPoint posUser;
MapController mc;
LinearLayout linearLayout;
MapView mapView;
Intent intent = null;

static GeoPoint posCar = PositionController.getCoordsCar();
static GeoPoint posUser = PositionController.getCoordsUser();

private LocationManager lm;
private LocationListener locationListener = new MyLocationListener();

int routeDefaultColor = Color.RED;

/**
 * Called when the activity is first created
 */
@Override
public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.main); // Use Layout "main.xml"

    lm = (LocationManager) getSystemService(Context.LOCATION_SERVICE);
    lm.requestLocationUpdates(LocationManager.GPS_PROVIDER, 1000, 0,
            locationListener);

    mapView = (MapView) findViewById(R.id.mapView); // Gets the map view by
    // ID
    mapView.setBuiltInZoomControls(true); // Enables the zoom buttons
    mc = mapView.getController();

    // Receive intent
    intent = getIntent();

    //posCar = PositionController.getCoordsCar();
    //posUser = PositionController.getCoordsUser();
    // Show only "car position" or "full route"

    // Show the full route
    // Calculates the geographic middle between start and end point
    int latMiddle = (int) ((posCar.getLatitudeE6() + posUser
            .getLatitudeE6()) / 2);
    int lonMiddle = (int) ((posCar.getLongitudeE6() + posUser
            .getLongitudeE6()) / 2);
    GeoPoint middle = new GeoPoint(latMiddle, lonMiddle);

    // Focus "middle"
    mc.setCenter(middle);

    // Retrieve route informations from google:
    // Generate URL for Google Maps query
    final String googleMapsUrl = "http://maps.google.com/maps?f=d&hl=en&saddr="
            + Double.toString(posUser.getLatitudeE6() / 1E6)
            + ","
            + Double.toString(posUser.getLongitudeE6() / 1E6)
            + "&daddr="
            + Double.toString(posCar.getLatitudeE6() / 1E6)
            + ","
            + Double.toString(posCar.getLongitudeE6() / 1E6)
            + "&ie=UTF8&0&om=0&output=kml" // Requested output format:
            + "&dirflg=w"; // Walking mode
    // KML-File
    Log.v("URL", googleMapsUrl);

    // Connect to the Internet and request corresponding KML file
    HttpURLConnection urlConn = null;
    try {
        // Start up a new URL-Connection
        URL url = new URL(googleMapsUrl);
        urlConn = (HttpURLConnection) url.openConnection();
        urlConn.setRequestMethod("GET");
        urlConn.setDoInput(true); // Needed for Input
        urlConn.setDoOutput(true); // Needed for Output
        urlConn.connect();

        // Parsing the KML file
        DocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance();
        DocumentBuilder db = dbf.newDocumentBuilder();
        Document doc = db.parse(urlConn.getInputStream());

        // Extract the <coordinates> Tag from <GeometryCollection> as
        // String
        String coordString = doc.getElementsByTagName("GeometryCollection")
                .item(0).getFirstChild().getFirstChild().getFirstChild()
                .getNodeValue();

        // Divide the huge string into an string array of coordinates,
        // using
        // " " as separator
        String[] coords = coordString.split(" ");

        String[] lngLat;

        lngLat = coords[0].split(",");
        GeoPoint gpFrom = new GeoPoint(
                (int) (Double.parseDouble(lngLat[1]) * 1E6), (int) (Double
                        .parseDouble(lngLat[0]) * 1E6));
        GeoPoint gpTo = null;
        for (int i = 1; i < coords.length; i++) {

            lngLat = coords[i].split(",");
            gpTo = new GeoPoint(
                    (int) (Double.parseDouble(lngLat[1]) * 1E6),
                    (int) (Double.parseDouble(lngLat[0]) * 1E6));

            mapView.getOverlays()
                    .add(
                            new PathOverlay(gpFrom, gpTo, Color.RED,
                                    getResources()));

            gpFrom = gpTo;

        }

    } catch (MalformedURLException e) {
        Log.v("Exception", "Generated URL is invalid");
        e.printStackTrace();
    } catch (ProtocolException e) {
        e.printStackTrace();
    } catch (IOException e) {
        e.printStackTrace();
    } catch (ParserConfigurationException e) {
        Log.v("Exception",
                "Error while parsing the KML file - Config error");
        e.printStackTrace();
    } catch (SAXException e) {
        Log.v("Exception",
                "Error while parsing the KML file - Parser error");
        e.printStackTrace();
    }

    MarkerOverlay pin1 = new MarkerOverlay(posCar, getResources());
    MarkerOverlay pin2 = new MarkerOverlay(posUser, getResources());

    mapView.getOverlays().add(pin1);
    mapView.getOverlays().add(pin2);
    mc.zoomToSpan(Math
            .abs(posCar.getLatitudeE6() - posUser.getLatitudeE6()), Math
            .abs(posCar.getLongitudeE6() - posUser.getLongitudeE6()));

    mapView.invalidate();

}

private class MyLocationListener implements LocationListener {
    int lat;
    int lon;

    @Override
    public void onLocationChanged(Location loc) {
        if (loc != null) {
            lat = (int) (loc.getLatitude() * 1E6);
            lon = (int) (loc.getLongitude() * 1E6);

            posUser = new GeoPoint(lat, lon);
            mapView.invalidate();
        }
    }

    @Override
    public void onProviderDisabled(String provider) {
        // TODO Auto-generated method stub
    }

    @Override
    public void onProviderEnabled(String provider) {
        // TODO Auto-generated method stub
    }

    @Override
    public void onStatusChanged(String provider, int status, Bundle extras) {
        // TODO Auto-generated method stub
    }
}

@Override
protected boolean isRouteDisplayed() {
    return false;
}

}

中间的巨大部分效果很好,可以忽略....可能因为mapView无效两次而发生错误? 在我看来,onCreate方法不再被调用。