誰かが知っていますか?トーストメッセージに対して何かをする可能性がある場合(私の場合はアクティビティを終了します)は閉じられますか?
これを行うには、Thread
が表示されている間続くToast
を作成し、Activity
を終了します。
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
// your other stuff
Toast.makeText(this,"This is a Toast", Toast.LENGTH_LONG).show();
thread.start();
}
ここで、(LENGTH_LONG = 3.5)または(LENGTH_SHORT = 2)秒待機するスレッドを作成します
Thread thread = new Thread(){
@Override
public void run() {
try {
Thread.sleep(Toast.LENGTH_LONG); // As I am using LENGTH_LONG in Toast
Your_Activity.this.finish();
} catch (Exception e) {
e.printStackTrace();
}
}
};
最初にToast
が表示され、2秒後にactivity
が終了します。
Toast.makeText(YourActivity.this, "MESSAGE", Toast.LENGTH_SHORT).show();
new Handler().postDelayed(new Runnable() {
@Override
public void run() {
YourActivity.this.finish();
}
}, 2000);
Android.widget.Toastは、終了時に通知するリスナーを提供していません。
Toast.getDuration()を呼び出して、その持続時間を確認し、Toastが消えたときに実行する独自のTimerTaskを作成して、そこでタスクを実行できます。
はい、しかしこれはトリックの方法です
Android Toastには、終了後にコールバックを設定する方法がありません。
だからあなたができることはこの事実に基づいています
private static final int LONG_DELAY = 3500; // 3.5 seconds
private static final int SHORT_DELAY = 2000; // 2 seconds
今あなたはできる:
これが私のやり方です...
このクラスには、それを呼び出したアクティビティを閉じるための呼び出しが含まれていることに注意してください。必要に応じて取り外してください。
また、スリープ時間はトーストの継続時間を追跡しますが、アクティビティが終了する前に少しのマージンを与えるために、0.5秒を追加しました。
public class Toaster implements Runnable
{
Context theContext;
CharSequence theMessage;
int theDuration;
Activity theActivity;
public Toaster( Activity a, Context c, CharSequence s, int i )
{
theActivity = a;
theContext = c;
theMessage = s;
theDuration = i;
}
@Override
public void run()
{
Toast toast = Toast.makeText(theContext, theMessage, theDuration );
toast.setGravity(Gravity.CENTER_HORIZONTAL|Gravity.CENTER_VERTICAL, 0, 0);
toast.show();
Thread t = new Thread( new Runnable()
{
@Override
public void run()
{
try
{
Thread.sleep(theDuration == Toast.LENGTH_SHORT ? 2500 : 4000);
}
catch (InterruptedException e)
{
e.printStackTrace();
}
theActivity.finish();
}
});
t.start();
}
}
アクティビティーには、次のようなコードのチャンクがあり、それを呼び出します。
Context c = getApplicationContext();
CharSequence msg = "Form Data Submitted!";
int duration = Toast.LENGTH_SHORT;
runOnUiThread( new Toaster(this, c, msg, duration) );
実際には、Toast
が終了しているときにコールバックはありませんが、知る必要がある場合は、いつ閉じるかによって、Toast
継続時間、次に必要な操作を実行します。これは問題を解決する方法の1つにすぎません。解決策は他にもあると思います。お役に立てれば。
あなたのユースケースが何であるかわかりませんが、本当にトーストが閉じてアクティビティが完了するのを待つ必要がありますか?
私の場合、URLからアプリへのエントリポイントであるアクティビティがあります(メールまたはWebページのリンクからアプリを開くことができます)。 URLが検証チェックに合格しない場合は、トーストを表示してアクティビティを終了します。
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
...
if (!validateUrl()) {
Toast.makeText(this, R.string.invalid_url, Toast.LENGTH_LONG).show();
finish();
return;
}
...
}
これはトーストを示しています。finish()を呼び出す前に、トーストが表示されなくなるまで待つ必要はありません。最初はこれが機能していないと思いましたが、トーストでshow()を呼び出すのを忘れたことが原因であることがわかりました!
これをToastで実行できるかどうかはわかりませんが、単純なダイアログでトーストを置き換えることができ(必要に応じてToastデザインを再利用できます)、次に onDetachedFromWindow
アクティビティのクロージャをウィンドウにフックします。
私はその「問題」のダウンロード用の単純なライブラリを作成しました。
https://github.com/mkiisoft/Toaster
次のように使用します。
Toaster.getInstance().makeText(context, "your custom message", Toast.LENGTH_SHORT, new OnToasterFinish() {
@Override
public void finish() {
// Your code over here after the Toast
}
});
Toast-Classを拡張し、独自のコールバックを使用します。
Atoik INotificationManager API(toastクラスの内部で使用されます)は、Toastを閉じるときに呼び出し元に通知するためのサポートがありません。
一時的な通知を表す内部クラスを選択するためにリフレクションを使用しないと、トーストが表示されているか非表示になっているかを確認する方法もありません。
トーストを呼び出してから、Onstop()を使用して終了します。トーストが表示されます。