私のアプリでは、アクティビティのカレンダーウィジェットを作成し、前月または翌月にスクロールすると、トーストを作って表示しました。
問題は、トーストが表示されるまでに時間がかかることです。たとえば、「2012/05」と「2012/06」までスクロールし、一時停止せずに「2012/07」までスクロールすると、待機する必要があります。 「2012/05」、「2012/06」、「2012/07」のトーストがゆっくりとひとつずつ表示されます。
Androidはトーストを管理するための非表示のキューを持っているようです
クリーニングして最後のトーストのみを表示するにはどうすればよいですか?特定のトーストを待たずにすぐに表示できますか?
"Android.widget.Toast.Java"を検索してメソッドcancel()
を見つけましたが、残念ながら次のように機能しません。
if (t != null) {
t.cancel();
}
t = Toast.makeText(this.mContext, mHelper.getYear() + "年"
+ (mHelper.getMonth() + 1) + "月", Toast.LENGTH_SHORT);
t.show();
正しいオブジェクトでメソッドを呼び出す必要があります。
toastObject.cancel()
ここに私の別の同様の質問からコピーされた私の答えがあります:
Boast
クラスは、必要なものを正確に実現します。最新のコードは、GitHubの次の場所にあります。
トリックは、最後に表示されたToast
を追跡し、それをキャンセルすることです。
私がやったことは、最後に表示されたトーストへの静的参照を含むToast
ラッパーを作成することです。
新しいものを表示する必要がある場合は、静的参照をキャンセルしてから、新しい参照を表示します(そして静的参照に保存します)。
これが私が作ったBoast
ラッパーの完全なコードです-それは私がそれを使用するのに十分なToastメソッドを模倣しています。デフォルトでは、Boast
は前のものをキャンセルするため、表示されるのを待っているトーストのキューを構築しません。
アプリを終了するときに通知をキャンセルする方法だけを知りたい場合は、そこに多くの助けがあります。
package mobi.glowworm.lib.ui.widget;
import Android.annotation.SuppressLint;
import Android.content.Context;
import Android.content.res.Resources;
import Android.support.annotation.Nullable;
import Android.widget.Toast;
import Java.lang.ref.WeakReference;
/**
* {@link Toast} decorator allowing for easy cancellation of notifications. Use this class if you
* want subsequent Toast notifications to overwrite current ones. </p>
* <p/>
* By default, a current {@link Boast} notification will be cancelled by a subsequent notification.
* This default behaviour can be changed by calling certain methods like {@link #show(boolean)}.
*/
public class Boast {
/**
* Keeps track of certain Boast notifications that may need to be cancelled. This functionality
* is only offered by some of the methods in this class.
* <p>
* Uses a {@link WeakReference} to avoid leaking the activity context used to show the original {@link Toast}.
*/
@Nullable
private volatile static WeakReference<Boast> weakBoast = null;
@Nullable
private static Boast getGlobalBoast() {
if (weakBoast == null) {
return null;
}
return weakBoast.get();
}
private static void setGlobalBoast(@Nullable Boast globalBoast) {
Boast.weakBoast = new WeakReference<>(globalBoast);
}
// ////////////////////////////////////////////////////////////////////////////////////////////////////////
/**
* Internal reference to the {@link Toast} object that will be displayed.
*/
private Toast internalToast;
// ////////////////////////////////////////////////////////////////////////////////////////////////////////
/**
* Private constructor creates a new {@link Boast} from a given {@link Toast}.
*
* @throws NullPointerException if the parameter is <code>null</code>.
*/
private Boast(Toast toast) {
// null check
if (toast == null) {
throw new NullPointerException("Boast.Boast(Toast) requires a non-null parameter.");
}
internalToast = toast;
}
// ////////////////////////////////////////////////////////////////////////////////////////////////////////
/**
* Make a standard {@link Boast} that just contains a text view.
*
* @param context The context to use. Usually your {@link Android.app.Application} or
* {@link Android.app.Activity} object.
* @param text The text to show. Can be formatted text.
* @param duration How long to display the message. Either {@link Toast#LENGTH_SHORT} or
* {@link Toast#LENGTH_LONG}
*/
@SuppressLint("ShowToast")
public static Boast makeText(Context context, CharSequence text, int duration) {
return new Boast(Toast.makeText(context, text, duration));
}
/**
* Make a standard {@link Boast} that just contains a text view with the text from a resource.
*
* @param context The context to use. Usually your {@link Android.app.Application} or
* {@link Android.app.Activity} object.
* @param resId The resource id of the string resource to use. Can be formatted text.
* @param duration How long to display the message. Either {@link Toast#LENGTH_SHORT} or
* {@link Toast#LENGTH_LONG}
* @throws Resources.NotFoundException if the resource can't be found.
*/
@SuppressLint("ShowToast")
public static Boast makeText(Context context, int resId, int duration)
throws Resources.NotFoundException {
return new Boast(Toast.makeText(context, resId, duration));
}
/**
* Make a standard {@link Boast} that just contains a text view. Duration defaults to
* {@link Toast#LENGTH_SHORT}.
*
* @param context The context to use. Usually your {@link Android.app.Application} or
* {@link Android.app.Activity} object.
* @param text The text to show. Can be formatted text.
*/
@SuppressLint("ShowToast")
public static Boast makeText(Context context, CharSequence text) {
return new Boast(Toast.makeText(context, text, Toast.LENGTH_SHORT));
}
/**
* Make a standard {@link Boast} that just contains a text view with the text from a resource.
* Duration defaults to {@link Toast#LENGTH_SHORT}.
*
* @param context The context to use. Usually your {@link Android.app.Application} or
* {@link Android.app.Activity} object.
* @param resId The resource id of the string resource to use. Can be formatted text.
* @throws Resources.NotFoundException if the resource can't be found.
*/
@SuppressLint("ShowToast")
public static Boast makeText(Context context, int resId) throws Resources.NotFoundException {
return new Boast(Toast.makeText(context, resId, Toast.LENGTH_SHORT));
}
// ////////////////////////////////////////////////////////////////////////////////////////////////////////
/**
* Show a standard {@link Boast} that just contains a text view.
*
* @param context The context to use. Usually your {@link Android.app.Application} or
* {@link Android.app.Activity} object.
* @param text The text to show. Can be formatted text.
* @param duration How long to display the message. Either {@link Toast#LENGTH_SHORT} or
* {@link Toast#LENGTH_LONG}
*/
public static void showText(Context context, CharSequence text, int duration) {
Boast.makeText(context, text, duration).show();
}
/**
* Show a standard {@link Boast} that just contains a text view with the text from a resource.
*
* @param context The context to use. Usually your {@link Android.app.Application} or
* {@link Android.app.Activity} object.
* @param resId The resource id of the string resource to use. Can be formatted text.
* @param duration How long to display the message. Either {@link Toast#LENGTH_SHORT} or
* {@link Toast#LENGTH_LONG}
* @throws Resources.NotFoundException if the resource can't be found.
*/
public static void showText(Context context, int resId, int duration)
throws Resources.NotFoundException {
Boast.makeText(context, resId, duration).show();
}
/**
* Show a standard {@link Boast} that just contains a text view. Duration defaults to
* {@link Toast#LENGTH_SHORT}.
*
* @param context The context to use. Usually your {@link Android.app.Application} or
* {@link Android.app.Activity} object.
* @param text The text to show. Can be formatted text.
*/
public static void showText(Context context, CharSequence text) {
Boast.makeText(context, text, Toast.LENGTH_SHORT).show();
}
/**
* Show a standard {@link Boast} that just contains a text view with the text from a resource.
* Duration defaults to {@link Toast#LENGTH_SHORT}.
*
* @param context The context to use. Usually your {@link Android.app.Application} or
* {@link Android.app.Activity} object.
* @param resId The resource id of the string resource to use. Can be formatted text.
* @throws Resources.NotFoundException if the resource can't be found.
*/
public static void showText(Context context, int resId) throws Resources.NotFoundException {
Boast.makeText(context, resId, Toast.LENGTH_SHORT).show();
}
// ////////////////////////////////////////////////////////////////////////////////////////////////////////
/**
* Close the view if it's showing, or don't show it if it isn't showing yet. You do not normally
* have to call this. Normally view will disappear on its own after the appropriate duration.
*/
public void cancel() {
internalToast.cancel();
}
/**
* Show the view for the specified duration. By default, this method cancels any current
* notification to immediately display the new one. For conventional {@link Toast#show()}
* queueing behaviour, use method {@link #show(boolean)}.
*
* @see #show(boolean)
*/
public void show() {
show(true);
}
/**
* Show the view for the specified duration. This method can be used to cancel the current
* notification, or to queue up notifications.
*
* @param cancelCurrent <code>true</code> to cancel any current notification and replace it with this new
* one
* @see #show()
*/
public void show(boolean cancelCurrent) {
// cancel current
if (cancelCurrent) {
final Boast cachedGlobalBoast = getGlobalBoast();
if ((cachedGlobalBoast != null)) {
cachedGlobalBoast.cancel();
}
}
// save an instance of this current notification
setGlobalBoast(this);
internalToast.show();
}
}
次のように「トースト」変数を宣言するだけです。
Toast toastMessage;
次に、関数で次のようにします。
if (toastMessage!= null) {
toastMessage.cancel();
}
toastMessage= Toast.makeText(context, "The message you want to display", duration);
toastMessage.show();
これがコードです。
final Toast toastobject = Toast.makeText(context, "This message will disappear when toast.close(); is called", Toast.LENGTH_SHORT);
これで、toastobjectのオブジェクトを使用できます。その 参照
toastobject.cancel();
スレッドで、またはトーストを閉じたいときにいつでも使用できます。
トーストは再利用できます。これにより、すぐに表示されます。
myToast.setText(toastMsg);
myToast.show();
別のトーストを表示したい場合、以前のトーストをキャンセルする方法はたくさんあります。以下に、私はそれを実装する最も簡単で簡単な方法を書きました。まず、クラス全体でアクセスできる変数を作成する必要があります。
private Toast toast;
クラス全体からアクセスできる変数を作成した後、トーストメッセージを表示し、前のトーストが表示されているかどうかを確認してキャンセルするメソッドをクラスに作成する必要があります。
public void showToast(String message) {
if (toast != null) {
toast.cancel();
}
toast = Toast.makeText(getApplicationContext(), message, Toast.LENGTH_SHORT);
toast.show();
}
上記のメソッドを実行時に呼び出すことでトーストメッセージを変更できます。
showToast("message 1");
//その後しばらくして
showToast("message 2");
それが役に立てば幸い。
シンプル。別のトーストを作成したい場合は、トーストでメソッド.cancel()を呼び出すだけです。
このようにクラスの上部でToast変数を定義することから始めます
private Toast mToast;
後で、新しいトーストを作成する(および古いトーストを非表示にする)場合は、これを実行します。
if(mToast != null) {
mToast.cancel(); //if a toast exists it deletes it, allowing you to create a new one
}
mToast = Toast.makeText(this, "This will show up now!", Toast.LENGTH_LONG);
mToast.show(); //creates the new toast.
静的メソッドを作成し、それを使用してトーストを表示できます。
public static Toast toast = null;
public static showToast(Context context,String msg){
if(toast!=null) //this will cancel the toast on the screen if one exists
toast.cancel();
toast = Toast.makeText(context,msg);
toast.show();
}
Toastには、現在のトーストメッセージを非表示にするメソッドがあります
public void cancel() {
mTN.hide();
}
必要に応じてt.cancel()を呼び出してみてください。
public static Toast sToast=null;
// create Toast object;
public void showToast(String msg)
{
//here is checking whether toast object is null or not;if not null gonna cancel the toast that is showing in phone window and make it null;
if(sToast!=null)
{
sToast.cancel;
sToast=null;
}
//if toast object is null,gonna create new instance and make it shown on phone window.
if(sToast==null)
{
sToast=Toast.makeText(currentActivity.this,msg,Duration);
sToast.setGravity();
sToast.show();
}
}