2016-08-07 9 views
0

トーストメッセージが表示されていない場合、または表示されているメッセージが送信したいメッセージと同じでない場合、トーストメッセージを表示することです。メッセージがユーザーに表示されているメッセージと同じ場合、メッセージは通過したくありません(無意味なので)。トーストが既存のトーストと異なる場合にのみ表示

この目標に向けて、私はthisの投稿が表示されていない場合にのみトーストを表示する方法を見つけました。

私は両方の要件に合わせてコードを修正しました。

private Toast toast; 

public void showAToast (String st, boolean isLong){ 
    try{ 
     toast.getView().isShown(); 
     String text = ((TextView)((LinearLayout)toast.getView()).getChildAt(0)).getText().toString(); 
     if(!text.equalsIgnoreCase(st)){ 
      //New message, show it after 
      if(isLong){ 
       toast = Toast.makeText(getApplicationContext(), st, Toast.LENGTH_LONG); 
      } else { 
       toast = Toast.makeText(getApplicationContext(), st, Toast.LENGTH_SHORT); 
      } 
      toast.show(); 
     } 
    } catch (Exception e) { 
     //New message 
     if(isLong){ 
      toast = Toast.makeText(getApplicationContext(), st, Toast.LENGTH_LONG); 
     } else { 
      toast = Toast.makeText(getApplicationContext(), st, Toast.LENGTH_SHORT); 
     } 
     toast.show(); 
    } 
} 

私の問題は、最後のトーストメッセージが通過するメッセージと同じであった場合には任意のメッセージが通過しないことです。

これがなぜ発生するのか正確にはわかりませんが、問題の原因を特定するためのデバッグメッセージをメソッドに挿入しました。

トーストメッセージがアプリの生存期間中に送信された場合、toast.getView()。isShown()は例外をスローしません(トーストが表示されないことを意味すると仮定します)。

私の質問は、どうすればこの問題を回避できますか?確かに、この望ましい機能を達成する方法がなければなりません。

+0

トーストされた最新のストリングを追跡できますか?次に、単にequals()で文字列を比較するだけです。 –

+0

Code-Apprenticeあなたはポイントを見逃しています。問題は、文字列が正しく比較されているということではなく、アプリケーションのライフサイクルのどの時点でトーストが送信された場合に、toast.isShown()メソッドが実行されるという問題です。つまり、トーストが画面に表示されていなくても、キャッチブロックコードの代わりにtryブロックコードをすべて実行します(想定されているように)。私はこの問題を回避する方法を求めています。 – NuffsaidM8

+0

OIC ...はい、私は完全に質問を誤解しましたが、あなたが仮定した理由ではない...私の悪い。 –

答えて

0

私はこれをstackoverflowで以前に見ましたが、私が気に入ったほどにはきれいではありません。 2つのトーストの間で交互に行われるデュアルトーストアプローチを実装しました。まず、前のOnCreateに活動のために乾杯を定義します。

Toast toast0; 
    Toast toast1; 
    private static boolean lastToast0 = true; 
    In the OnCreate: 

    toast0 = new Toast(getApplicationContext()); 
    toast0.cancel(); 
    toast1 = new Toast(getApplicationContext()); 
    toast1.cancel(); 
    //And finally, when I need to display the toast and cancel the prior toast at the same time I use something similar to: 

      if (lastToast0) { 
       toast0.cancel(); 
       toast1.setDuration(Toast.LENGTH_LONG); 
       toast1.setText("new message"); 
       toast1.show(); 
       lastToast0 = false; 
      } else { 
       toast1.cancel(); 
       toast0.setDuration(Toast.LENGTH_LONG); 
       toast0.setText("new message"); 
       toast0.show(); 
       lastToast0 = true; 
      } 
    // If you need to just cancel an existing toast (before it times out) use: 

       toast0.cancel(); 
       toast1.cancel(); 

引用

0

あなたがメッセージを表示するために、同じToastインスタンスを使用することができます。メッセージが同じ場合、トーストは2回表示されません。そうでない場合、テキストは最新のものに簡単に変更されます。

Toast mToast; 

public void showToast(CharSequence message, int during){ 
    if (mToast == null) { 
     mToast = Toast.makeText(getApplicationContext(), message, during); 
    } else { 
     mToast.setText(message); 
    } 
    mToast.show(); 
} 

- ↓---↓----↓--- update--↓↓---- ---↓ - ↓

そのことについて申し訳ありませんが、私は上記のあなたのポイントを欠場。

ビューがWindownManagerに追加されているため、ビューステータスを取得できないというToastのソースを読んでいます。遠くに、Toastが表示されているかどうかを示すメソッドを見つけることができません。

しかし、自分のToast use Serviceを実現することができます。これは、アプリケーションの上に示されたトーストが好きです。それはより簡単かもしれません。

+0

これは同じメッセージを連続して2回拒否するでしょうか?これは、現在のメソッドが既に持っている機能であり、私が望むものではありません。メッセージが既に画面に表示されている場合は、繰り返されるメッセージは通過させたくありません。画面にメッセージがない場合は、メッセージを送信する必要があります。 – NuffsaidM8

+0

はい、あなたは正しいです。私の答えを更新した後。 – vcokey

関連する問題