Отмена уже открытого тоста в Android - PullRequest
8 голосов
/ 19 июля 2011

В настоящее время я начинаю разрабатывать приложения для Android и изучаю это руководство о том, как использовать и улучшать приложение карт Google.

Мне удалосьпоказать на экране карту, при прикосновении я получаю адрес местоположения (через обратное геокодирование) с отображением Toast.Но вот моя проблема - когда вы нажимаете несколько раз подряд по карте, вы получаете все toasts один за другим, и каждому из них потребуется время (в моем случае - Toast.LENGTH_LONG), чтобы исчезнуть.Я хочу, чтобы приложение автоматически закрывало старый тост и показывало новый тост с новым адресом.

В других ресурсах, которые я обнаружил, я должен использовать метод 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 ]

22 голосов
/ 19 июля 2011

Вы не показываете, где у вас есть 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 голос
/ 19 июля 2011

Вам нужно получить экземпляр при создании Toast с помощью вызова make (). После этого, прежде чем показывать новый тост, вы должны отменить старый Toast.GoodLuck!

...