web-dev-qa-db-ja.com

トーストメッセージが消えた後にアクティビティを終了しますか?

誰かが知っていますか?トーストメッセージに対して何かをする可能性がある場合(私の場合はアクティビティを終了します)は閉じられますか?

30
Tima

これを行うには、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();
                }
             }  
           };
45
Lalit Poptani

最初に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);
16
Julio Betta

Android.widget.Toastは、終了時に通知するリスナーを提供していません。

Toast.getDuration()を呼び出して、その持続時間を確認し、Toastが消えたときに実行する独自のTimerTaskを作成して、そこでタスクを実行できます。

9
Pointer Null

はい、しかしこれはトリックの方法です

Android Toastには、終了後にコールバックを設定する方法がありません。

だからあなたができることはこの事実に基づいています

private static final int LONG_DELAY = 3500; // 3.5 seconds
private static final int SHORT_DELAY = 2000; // 2 seconds

今あなたはできる:

  1. トーストを準備する
  2. LENGTH_LONG(3.5s)またはLENGTH_SHORT(2s)に基づいてカウンタースレッドを設定し、アクティビティを閉じます。
  3. toast.show()およびthread.start();
8
Terence Lui

これが私のやり方です...

このクラスには、それを呼び出したアクティビティを閉じるための呼び出しが含まれていることに注意してください。必要に応じて取り外してください。

また、スリープ時間はトーストの継続時間を追跡しますが、アクティビティが終了する前に少しのマージンを与えるために、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) );
3
Mike Fulton

実際には、Toastが終了しているときにコールバックはありませんが、知る必要がある場合は、いつ閉じるかによって、Toast継続時間、次に必要な操作を実行します。これは問題を解決する方法の1つにすぎません。解決策は他にもあると思います。お役に立てれば。

2
Egor

あなたのユースケースが何であるかわかりませんが、本当にトーストが閉じてアクティビティが完了するのを待つ必要がありますか?

私の場合、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()を呼び出すのを忘れたことが原因であることがわかりました!

1
Vicki

これをToastで実行できるかどうかはわかりませんが、単純なダイアログでトーストを置き換えることができ(必要に応じてToastデザインを再利用できます)、次に onDetachedFromWindow アクティビティのクロージャをウィンドウにフックします。

1
Sephy

私はその「問題」のダウンロード用の単純なライブラリを作成しました。

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
                }
            });
1

Toast-Classを拡張し、独自のコールバックを使用します。

0
Thommy

Atoik INotificationManager API(toastクラスの内部で使用されます)は、Toastを閉じるときに呼び出し元に通知するためのサポートがありません。

一時的な通知を表す内部クラスを選択するためにリフレクションを使用しないと、トーストが表示されているか非表示になっているかを確認する方法もありません。

0
Jens

トーストを呼び出してから、Onstop()を使用して終了します。トーストが表示されます。

0
Thiru