在Android中取消已经开放的吐司

时间:2011-07-19 08:14:58

标签: android google-maps toast

我目前正在开发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;
}

2 个答案:

答案 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!