java 如何刷新活动?地图视图刷新失败
声明:本页面是StackOverFlow热门问题的中英对照翻译,遵循CC BY-SA 4.0协议,如果您需要使用它,必须同样遵循CC BY-SA许可,注明原文地址和作者信息,同时你必须将它归于原作者(不是我):StackOverFlow
原文地址: http://stackoverflow.com/questions/2756409/
Warning: these are provided under cc-by-sa 4.0 license. You are free to use/share it, But you must attribute it to the original authors (not me):
StackOverFlow
How to refresh an activity? Map View refresh fails
提问by poeschlorn
After implementing some Android Apps, including several Map activities, I try to refresh the activity when the GPS listener's onLocationChanged() method is called.
在实现了一些 Android 应用程序(包括多个地图活动)后,我尝试在调用 GPS 侦听器的 onLocationChanged() 方法时刷新活动。
I have no idea how to tell the map activity to refresh on its own and display the new coords...
我不知道如何告诉地图活动自行刷新并显示新坐标...
The coords to store will have to be in global values, so that the location listener will have access to it.
要存储的坐标必须是全局值,以便位置侦听器可以访问它。
In my sample GPS-class (see code below) I just changed the text of a text view....but how to do that in map view?
在我的示例 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());
}
}
I think the solution of this Problem won't be very difficult, but I just need the beginning ;-)
我认为这个问题的解决方案不会很困难,但我只需要开始;-)
This whole app shall work like a really simple navigation system.
整个应用程序应该像一个非常简单的导航系统一样工作。
It would be great if someone could help me a little bit further :)
如果有人能进一步帮助我,那就太好了:)
回答by WarGoth
You can call View::invalidate() ( http://developer.android.com/reference/android/view/View.html#invalidate()), so the View will redraw using View::onDraw() method. To use it, you should move your code to a View (MapView for example), to its onDraw() method.
您可以调用 View::invalidate() ( http://developer.android.com/reference/android/view/View.html#invalidate()),因此 View 将使用 View::onDraw() 方法重绘。要使用它,您应该将代码移动到视图(例如 MapView)的 onDraw() 方法中。
回答by poeschlorn
thanks for the answer, in theory that sounds great. But I retrieve no Update on my map... the comment function offers to small space for my code, that's why I post it right here:
感谢您的回答,理论上听起来不错。但是我在我的地图上没有检索到更新......评论功能为我的代码提供了很小的空间,这就是我将其发布在这里的原因:
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;
}
}
The huge part in the middle works great and can be ignored....may the error occur because the mapView is invalidated twice? It seems to me that the onCreate method is not called again.
中间的巨大部分效果很好,可以忽略……可能是因为 mapView 两次失效而发生错误?在我看来,没有再次调用 onCreate 方法。

