我目前正在开发Android应用程序,我一直在关注如何使用和改进Google地图应用程序的this tutorial。
我设法在屏幕上显示地图,在触摸时我获得一个位置的地址(通过反向地理编码)并显示Toast
。但是这是我的问题 - 当您在地图上连续点击多次时,您将获得所有toasts
一个接一个,并且每个人都将花费他的时间(在我的情况下 - Toast.LENGTH_LONG
)消失。我想让应用程序自动关闭旧的toast并显示一个新的toast,点击新的地址。
在其他资源中,我发现我应该使用toast.cancel()
方法来实现此目的,但我在使用它时遇到了麻烦 - 我已经覆盖了onTouchEvent
- 如何才能检测到有新的触摸? toast
正在显示的地图?
或者你可能会建议我更好地隐藏已经开放的toast
?
我试图让我的Toast
地址成为全球地址,但它也不起作用。
以下是我的应用程序代码:
@Override
public boolean onTouchEvent(MotionEvent event, MapView mapView) {
//---when user lifts his finger---
if (event.getAction() == 1) {
GeoPoint p2 = mapView.getProjection().fromPixels((int) event.getX(), (int) event.getY());
Geocoder geoCoder = new Geocoder(getBaseContext(), Locale.getDefault());
try {
List<Address> addresses = geoCoder.getFromLocation(p2.getLatitudeE6() / 1E6,
p2.getLongitudeE6() / 1E6, 1);
String add = " ";
if (addresses.size() > 0)
for (int i=0; i<addresses.get(0).getMaxAddressLineIndex();i++)
add += addresses.get(0).getAddressLine(i) + "\n";
Toast address;
address = Toast.makeText(getBaseContext(), add, Toast.LENGTH_LONG);
address.show();
}
catch (IOException e) {
e.printStackTrace();
}
return true;
}
return false;
}
答案 0 :(得分:22)
您没有显示Toast address
作为全局的位置,但每次单击时都会创建一个新的本地Toast对象:
Toast address;
address = Toast.makeText(getBaseContext(), add, Toast.LENGTH_LONG);
address.show();
将覆盖您正在创建的全局对象。我建议您在班级中使用address
作为private static
对象,以确保无论您点击多少次,地址始终都是同一个对象,这样您始终取消Toast
你上次展示的(因为只有一个),并删除本地声明:
private static Toast address;
...
if (address != null)
address.cancel();
address = Toast.makeText(getBaseContext(), add, Toast.LENGTH_LONG);
address.show();
答案 1 :(得分:1)
你需要通过调用make()创建Toast来获取实例。在你显示新的吐司之前,你应该取消旧的Toast.GoodLuck!