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

问题描述:

在实施一些Android应用程序(包括几个Map活动)后,我尝试在GPS侦听器的onLocationChanged()方法被调用时刷新活动。如何刷新活动?地图视图刷新失败

我不知道如何告诉地图活动自行刷新并显示新COORDS ...

的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()); 
     } 
    } 

我觉得这个问题的解决不会很困难,但我只需要开始;-)

这整个程序应像一个非常简单的导航系统正常工作。

这将是巨大的,如果有人可以帮助我一点点进一步:)

你可以调用查看::无效()(http://developer.android.com/reference/android/view/View.html#invalidate()),因此视图将重绘使用View ::的onDraw()方法。要使用它,你应该将你的代码移动到一个视图(例如MapView),它的onDraw()方法。

+0

以一种奇怪的方式我的代码(见下文)不覆盖“旧”geoPoints ....奇怪,奇怪... – poeschlorn 2010-05-04 12:02:34

+0

我必须将新的MapView类添加到叠加列表吗? – poeschlorn 2010-05-04 12:35:51

感谢您的回答,理论上听起来不错。但我找回我的地图没有更新...的评论功能提供了小空间我的代码,这就是为什么我在这里张贴:

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方法不会再次调用。

+1

所以:我想通了,我必须在位置侦听器的onLocationChanged()方法中重绘我的覆盖。 onCreate方法在开始时称为ONCE。 通过从我的代码中分离出一个独立的方法,从上面的两个代码中调用它,它工作的很棒:) 我希望别人能够从这方面受益;-) – poeschlorn 2010-05-05 11:48:21