在实施了一些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());
}
}
我认为这个问题的解决方案不会很困难,但我只需要开头; - )
整个应用程序应该像一个非常简单的导航系统。
如果有人可以帮助我一点点,那就太好了。)
答案 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方法不再被调用。