2011-07-19 11 views
8

現在、Androidアプリケーションの開発を開始しており、Googleマップアプリケーションの使い方と改善方法については、this tutorialをフォローしています。Androidで既に開いているトーストをキャンセルする

マップ上に地図を表示することができました。タッチのときに、逆方向ジオコーディングを使用して住所の住所が表示されます(Toast)。しかし、ここに私の問題があります。地図上で何度も連続して何回かクリックすると、toastsが1つずつ取得され、それぞれが自分の時間(私の場合は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; 
} 
+0

toast.cancel()は機能しません。それは呼ばれていますか? –

+0

また、 'event.getAction()== 1'の代わりに' ACTION_UP == event.getAction() 'を使うことをお勧めします。それは単なる良いスタイルです。 –

+0

の可能な複製[アンドロイドで別の方法で作成されたトーストをキャンセルする方法](http://stackoverflow.com/questions/5503682/how-to-cancel-toast-created-in-a-different-method-on - アンドロイド) – Wroclai

答えて

22

あなたがグローバルとしてToast addressを持ってどこに表示されませんが、あなたは新しい、ローカルトーストオブジェクトにあなたがクリックするたびに作成されています

Toast address; 
address = Toast.makeText(getBaseContext(), add, Toast.LENGTH_LONG); 
address.show(); 

作成するグローバルオブジェクトを上書きします。あなたのクラスのprivate staticオブジェクトとしてaddressを持つことをお勧めします。あなたが最後に表示したToastをいつもキャンセルするように、何回クリックしてもアドレスは常に同じオブジェクトになるようにしてください。 、およびローカル宣言取り除く:あなたは新しいトーストを表示する前にこの後、古いキャンセルする必要がありますが、コール・メイク(でトーストを作成するときに、インスタンスを取得する必要があり

private static Toast address; 

...

if (address != null) 
    address.cancel(); 

address = Toast.makeText(getBaseContext(), add, Toast.LENGTH_LONG); 
address.show(); 
+0

'私的静的トーストアドレス; 宣言をグローバルなものとして移動しました。 ここでaddress.cancel()メソッドを使用すると、トーストがキャンセルされ、何も表示されません。画面に新しいタッチがある場合にのみトーストのキャンセルを呼び出す方法は? –

+0

新しいトーストを表示する前に、あなたのonTouchEventで 'address.cancel()'を呼び出すだけです。これは既存のトーストがある場合はキャンセルします(表示するか表示するのを待っています)。 – RivieraKid

+0

私は 'アドレス= Toast.makeText(getBaseContext()、add、Toast.LENGTH_LONG)で試しました。 address.cancel(); アドレス。show(); ' でも同じ結果が得られます。寿命は寿命が終わった後にのみ変化します。 –

1

を)。トースト!GoodLuck!

+0

'Toast.makeText'は' make ) '? ここで私は質問があります。OnTouchEventメソッドの初めに、既に開いているトーストのチェックをすることができます - 開いているものがあればそれをキャンセルし、新しいものを開くことで進む。しかし、オープントーストの存在を確認するための組み込みメソッドはありますか? –

+0

RivieraKidは私の方法と同じ解決策を述べています。 – duonghv

+0

私はあなたのことを以前は持っていませんでしたが、今はどうやってやったのか分かりません。 –

関連する問題