web-dev-qa-db-ja.com

特定の期間トーストを表示するにはどうすればよいですか?

これは、Toastを500ミリ秒表示する方法です。ただし、1秒以上表示されています。

Toast.makeText(LiveChat.this, "Typing", 500).show(); 

Toastを500ミリ秒だけ表示するにはどうすればよいですか?

22
MuraliGanesan

これはできません。 Toast.LENGTH_SHORTより短い長さのトーストを表示するには、希望する時間後にトーストをキャンセルする必要があります。何かのようなもの:

final Toast toast = Toast.makeText(getApplicationContext(), "This message will disappear in half a second", Toast.LENGTH_SHORT);
    toast.show();

    Handler handler = new Handler();
        handler.postDelayed(new Runnable() {
           @Override
           public void run() {
               toast.cancel(); 
           }
    }, 500);
66
Raghav Sood

同じメッセージでshowToastメソッドを複数回呼び出したときに時間を累積したくない場合は、@ Senthの答えに追加します。

private Toast mToastToShow = null;
String messageBeingDisplayed = "";

/**
 * Show Toast message for a specific duration, does not show again if the message is same
 *
 * @param message     The Message to display in toast
 * @param timeInMSecs Time in ms to show the toast
 */
public void showToast(String message, int timeInMSecs) {
    if (mToastToShow != null && message == messageBeingDisplayed) {
        Log.d("DEBUG", "Not Showing another Toast, Already Displaying");
        return;
    } else {
        Log.d("DEBUG", "Displaying Toast");
    }
    messageBeingDisplayed = message;
    // Set the toast and duration
    int toastDurationInMilliSeconds = timeInMSecs;
    mToastToShow = Toast.makeText(this, message, Toast.LENGTH_LONG);

    // Set the countdown to display the toast
    CountDownTimer toastCountDown;
    toastCountDown = new CountDownTimer(toastDurationInMilliSeconds, timeInMSecs /*Tick duration*/) {
        public void onTick(long millisUntilFinished) {
            if (mToastToShow != null) {
                mToastToShow.show();
            }
        }

        public void onFinish() {
            if (mToastToShow != null) {
                mToastToShow.cancel();
            }
            // Making the Toast null again
            mToastToShow = null;
            // Emptying the message to compare if its the same message being displayed or not
            messageBeingDisplayed = "";
        }
    };

    // Show the toast and starts the countdown
    mToastToShow.show();
    toastCountDown.start();
}

次のように、500ミリ秒間トーストを表示できます。

showToast("Not Allowed", 500);
3
shabby

この答え が見つかりました。少し複雑ですが、Toast.LENGTH_LONGよりも長いトーストを作成することもできます。ティック期間を1000msから500msに変更する必要がある場合があります。

private Toast mToastToShow;
public void showToast(View view) {
   // Set the toast and duration
   int toastDurationInMilliSeconds = 10000;
   mToastToShow = Toast.makeText(this, "Hello world, I am a toast.", Toast.LENGTH_LONG);

   // Set the countdown to display the toast
   CountDownTimer toastCountDown;
   toastCountDown = new CountDownTimer(toastDurationInMilliSeconds, 1000 /*Tick duration*/) {
      public void onTick(long millisUntilFinished) {
         mToastToShow.show();
      }
      public void onFinish() {
         mToastToShow.cancel();
         }
   };

   // Show the toast and starts the countdown
   mToastToShow.show();
   toastCountDown.start();
}

仕組みは次のとおりです。カウントダウンの通知時間は、フラグに従ってトーストが表示される期間よりも短いため、カウントダウンが終了していない場合はトーストを再度表示できます。トーストがまだ画面上にあるときに再び表示される場合、トーストは点滅せずに全体にわたってそこにとどまります。カウントダウンが終了すると、表示期間が終了していなくても、トーストはキャンセルされて非表示になります。

これは、デフォルトの期間よりも短い期間トーストを表示する必要がある場合でも機能します。表示される最初のトーストは、カウントダウンが終了すると単純にキャンセルされます。

2

これは私のためにうまく機能しています。

final Toast mToastToShow;
            int toastDurationInMilliSeconds = 10000;
            mToastToShow =  Toast.makeText(getApplicationContext(), "Snapshot Saved Successfully.",Toast.LENGTH_LONG);


            // Set the countdown to display the toast
            CountDownTimer toastCountDown;
            toastCountDown = new CountDownTimer(toastDurationInMilliSeconds, 1000 /*Tick duration*/) {
                public void onTick(long millisUntilFinished) {
                    mToastToShow.show();
                }
                public void onFinish() {
                    mToastToShow.cancel();
                }
            };

            // Show the toast and starts the countdown
            mToastToShow.show();
            toastCountDown.start();

カウントダウンは、特定の期間のトーストメッセージを表示するために使用されます。

1
Liya

標準のトーストでは、求めていることを実行できません。おそらく、より良いToastオプション(Croutonという名前)を提供するサードパーティライブラリを統合することを検討する必要があります。私自身は使っていませんが、人々はそれを気に入っているようです。

標準OSではトーストの長さを制御できません。

クルトンリンク: https://github.com/keyboardsurfer/Crouton

1
Booger

これはできません。 Toast.LENGTH_SHORTToast.LENGTH_LONGの値は0と1です。つまり、実際の期間ではなくフラグとして扱われるため、これらの値以外に期間を設定することはできないと思います。

1
Rob Avery IV

受け入れられた答えは正しいですが、私の場合、トーストの点滅(表示と非表示)に気付くことができます。

Toastが点滅していないソリューションがあり、Toastもカスタマイズできます。

さぁ、始めよう、

1)LongToastという名前のクラスを作成します。

class LongToast {

private LongToast() {}

static void makeLongToast(Context context,String text, long durationInMillis) 
{

 final Toast toastMessage = new Toast(context);

 //Creating TextView.
 TextView textView = new TextView(context);

 //Setting up Text Color.
 textView.setTextColor(Color.parseColor("#fafafa"));

 //Setting up Text Size.
 textView.setTextSize(17);

 //Setting up Toast Message Text.
 textView.setText(text);

 //Add padding to Toast message.
 textView.setPadding(20, 20, 20, 23);

 //Add Gravity TextView.
 textView.setGravity(Gravity.CENTER);

 //Adding TextView into Toast.
 toastMessage.setView(textView);

 //Access toast message as View.
 View toastView = toastMessage.getView();

 //Set Custom Background on Toast.
 toastView.setBackgroundResource(R.drawable.test);


 new CountDownTimer(durationInMillis, 1000)
  {
   public void onTick(long millisUntilFinished)
   {
    toastMessage.show();
   }
  public void onFinish()
   {
    toastMessage.cancel();
   }

  }.start();
 }
}

2)Toastをカスタマイズするためのドローアブルxmlを作成します。

<selector xmlns:Android="http://schemas.Android.com/apk/res/Android">
<item>
 <shape Android:shape="rectangle">
 <solid Android:color="#009973"/>
 <corners Android:radius="20dp" />
 <stroke
  Android:width="4dp"
  Android:color="#01ffc0"
 />
</shape>

必要に応じてトーストをカスタマイズできます。

3)最後にトーストを呼び出します。

LongToast.makeLongToast(this,"whatever you want",10000);//duration in seconds

ref: チェックするにはここをクリック

ありがとう!!。

0
Rajesh Naddy

私は別の方法を試してみましたが、この方法は私のために機能します

 final Toast mytoast = Toast.makeText(getApplicationContext(), jsonObject.getString("response_message"), Toast.LENGTH_SHORT);
 mytoast.show();

                        Handler handler = new Handler();
                        handler.postDelayed(new Runnable() {
                            @Override
                            public void run() {
                                mytoast.cancel();
                            }
                        }, 5000);// 5 sec
0
other Tall guy

これができるとは思わない、使用できるのはToast.LENGTH_LONGまたはToast.LENTH_SHORTあなたの知っている速度を定義することはできません。

0
Boardy

ドロイド側でToastMessageクラスを作成しました。

   public class ToastMessage: IToast
        {
            public void LongAlert(string message)
            {
                Toast toast = Toast.MakeText(Android.App.Application.Context, message, ToastLength.Short);
                toast.Show();
                Device.StartTimer(TimeSpan.FromSeconds(0.5), () =>
                {               
                   toast.Cancel();
                    return false;
                });
            }
        }

インターフェイスIToastを作成しました

 public  interface IToast
    {
        void LongAlert(string message);
    }

依存関係サービスによる呼び出し

 DependencyService.Get<IToast>().LongAlert("Right Answer");
0
Mudit Sharma

Toast.LENGTH_LONGの例のパターンを変更することもできます。

Toast.makeText(getBaseContext(),"your message",Toast.LENGTH_LONG*3).show();

パターンの持続時間は1秒であることを思い出してください

0
João Vitor

まず試してみてください。これにより、トーストがミリ秒単位の特定の期間に設定されます。

public void toast(int millisec, String msg) {
    Handler handler = null;
    final Toast[] toasts = new Toast[1];
    for(int i = 0; i < millisec; i+=2000) {
        toasts[0] = Toast.makeText(this, msg, Toast.LENGTH_SHORT);
        toasts[0].show();
        if(handler == null) {
            handler = new Handler();
            handler.postDelayed(new Runnable() {
                @Override
                public void run() {
                    toasts[0].cancel();
                }
            }, millisec);
        }
    }
}
0
LEMUEL ADANE