如何刷新活动?地图视图刷新失败
在实施一些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()方法。
感谢您的回答,理论上听起来不错。但我找回我的地图没有更新...的评论功能提供了小空间我的代码,这就是为什么我在这里张贴:
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方法不会再次调用。
所以:我想通了,我必须在位置侦听器的onLocationChanged()方法中重绘我的覆盖。 onCreate方法在开始时称为ONCE。 通过从我的代码中分离出一个独立的方法,从上面的两个代码中调用它,它工作的很棒:) 我希望别人能够从这方面受益;-) – poeschlorn 2010-05-05 11:48:21
以一种奇怪的方式我的代码(见下文)不覆盖“旧”geoPoints ....奇怪,奇怪... – poeschlorn 2010-05-04 12:02:34
我必须将新的MapView类添加到叠加列表吗? – poeschlorn 2010-05-04 12:35:51