Android - Скрыть все показанные сообщения о Toast
Как удалить все тосты, отображаемые в настоящее время?
В моем приложении есть список, когда пользователь нажимает на элемент, отображается тост-сообщение,
10 предметов - 10 тостов.
Итак, если пользователь нажимает 10 раз, то нажимает кнопку меню, им приходится ждать несколько секунд, пока они не смогут прочитать текст опции меню.
Это не должно быть так:)
Ответы
Ответ 1
Мое решение состояло в том, чтобы инициализировать единый Toast в активности. Затем измените свой текст на каждый клик.
Toast mToast = Toast.makeText(this, "", Toast.LENGTH_SHORT);
if (a) {
mToast.setText("This is a");
mToast.show();
} else if (b) {
mToast.setText("This is b");
mToast.show();
}
Ответ 2
как отключить все тосты в настоящее время?
Вы можете отменить индивидуальный Toasts
, вызвав cancel()
в объекте Toast
. AFAIK, вы не можете отменить все выдающиеся Toasts
, однако.
Ответ 3
Как проверить, отображается ли тост?
private Toast toast;
...
void showToast() {
if (toast == null || toast.getView().getWindowVisibility() != View.VISIBLE) {
toast = Toast.makeText(getActivity(), "Toast!", Toast.LENGTH_LONG);
toast.show();
}
}
Ответ 4
Решение Mudar отлично работало для меня по аналогичной проблеме - у меня были разные тосты, складывающиеся в отставание после нескольких кликов button
.
Один экземпляр Toast с разными setText()s
и show()
был именно тем, что я искал - предыдущее сообщение было отменено, как только нажимается новая кнопка. Пятно на
Просто для справки, вот что я сделал...
В OnCreate
:
final Toast myToast = Toast.makeText(getBaseContext(), "", Toast.LENGTH_SHORT);
Внутри каждого OnClick
:
myToast.setText(R.string.toast1);
myToast.show();
Ответ 5
Я думаю, что нашел способ сделать сообщение с тостами не в очереди для меня. Думал, что поделюсь.
эта часть идет вверх.
private Toast msg;
Эта часть идет в моем setOnTouchListener()
if(null == msg)
{
msg = Toast.makeText("Message to user!", Toast.LENGTH_SHORT);
msg.setGravity(Gravity.CENTER, msg.getXOffset() / 2, msg.getYOffset() / 2);
msg.show();
//handels the stupid queueing toast messages
new Handler().postDelayed(new Runnable()
{
public void run()
{
msg = null;
}
}, 2000);
}
Это скорее хак, чем что-либо. Но я показываю тост-сообщение в любое время, когда кто-то из фаворитов будет частью моего приложения. И если они сойдут с ума, нажав на любимую кнопку, он сойдет с ума от сообщений с тостами. Но не больше. Он будет ждать 2 секунды, а затем установите для моего тоста объект null и снова отобразит его.
Ответ 6
Мое решение состоит в том, чтобы сохранить все тосты в списке и сделать способ отменить все их, когда это необходимо:
private ArrayList<Toast> msjsToast = new ArrayList<Toast>();
private void killAllToast(){
for(Toast t:msjsToast){
if(t!=null) {
t.cancel();
}
}
msjsToast.clear();
}
Когда вы создаете Toast, сделайте этот путь и сохраните ссылку:
Toast t = Toast.makeText(context, "Download error: xx", Toast.LENGTH_LONG);
t.show();
msjsToast.addToast(t);
Когда вам нужно удалить их:
killAllToast();
Вы можете создать это как статический метод в глобальном классе и использовать его для уничтожения всего тоста приложения.
Ответ 7
Вот как я это делаю.
Toast toast;
if(toast==null)
toast=Toast.makeText(getApplicationContext(),R.string.act_now_private_post_text,Toast.LENGTH_LONG);
else
toast.setText(R.string.act_now_private_post_text);
toast.setGravity(Gravity.CENTER_VERTICAL|Gravity.CENTER_HORIZONTAL,10,10);
toast.show();
Ответ 8
Вот мой простой ответ на проблему:
Сначала в вашей деятельности создайте глобальный объект Toast
.
private Toast example;
Теперь, когда вы хотите вызвать новое сообщение Toast, просто выполните следующее:
if(buttonClicked) {
example.cancel();
example = Toast.makeText(this, "" , Toast.LENGTH_SHORT);
example.setText("Button Clicked");
example.show();
}
Это держит все тосты в одном центральном тосте и удаляет спам Тоста. Это быстрое грубое решение, поэтому, возможно, есть более элегантный способ сделать это.
Ответ 9
mToast=Toast.makeText(this, "", Toast.LENGTH_LONG);
showToast.setOnClickListener(new OnClickListener() {
public void onClick(View v) {
mToast.cancel();
String text=null;
if(ON)
{
text="Toast is on";
}
else
{
text="Toast is off";
}
mToast.setText(text);
mToast.setDuration(Toast.LENGTH_SHORT);
mToast.show();
}
});
Ответ 10
Вы можете использовать вот так.
class MyToast {
private static Toast t;
public MyToast(Context ctx, String message) {
if (t != null) {
t.cancel();
t = null;
}
t = Toast.makeText(ctx, message, Toast.LENGTH_SHORT);
}
public void show() {
t.show();
}
}
Ответ 11
Используя превосходный ответ Мадура выше, я распространил это на класс, который будет обрабатывать разные типы сообщений:
public class ToastManager {
private Toast toastWarningMessage;
private Toast toastAddMessage;
...
public void messageWarning(Context context, String message) {
if(toastWarningMessage == null) {
toastWarningMessage = Toast.makeText(context, message, Toast.LENGTH_SHORT);
} else {
toastWarningMessage.cancel();
toastWarningMessage.setText(message);
}
toastWarningMessage.show();
}
public void messageAdd(Context context, String message) {
if(toastAddMessage == null) {
toastAddMessage = Toast.makeText(context, message, Toast.LENGTH_SHORT);
} else {
toastAddMessage.cancel();
toastAddMessage.setText(message);
}
toastAddMessage.show();
}
...
}
И это вызвано из моей основной деятельности:
ToastManager toastManager;
...
private void toastWarningMessage(String message) {
if(toastManager == null) toastManager = new ToastManager();
toastManager.messageWarning(this, message);
}
Причиной классификации сообщений является то, что важные сообщения не будут перезаписаны. Это решение кажется простым повторным использованием, поскольку оно включает только переименование Тостов и имен функций.
Когда пользователь спам кнопки, тост будет просто отменять каждый раз для одного и того же типа сообщения. Единственная проблема заключается в том, что пользователь может спамить соединение сообщений. Это приводит к тому, что первое сообщение повторяется, и как только оно окончательно истекает, другие сообщения отображаются один раз. Не очень большая проблема, но что-то, о чем нужно знать.
Я не рассматривал возможные недостатки нескольких экземпляров Toast.
Ответ 12
В моем приложении очередные тосты появляются снова и снова, когда приложение переходит в фоновый режим, поэтому я сделал следующее, чтобы решить проблему.
Добавить код, чтобы обнаружить, когда приложение переходит в фоновый режим. Один из способов зарегистрировать обработчик жизненного цикла. Подробнее... ref
registerActivityLifecycleCallbacks(new MyLifecycleHandler());
App.inBackground = true;
, когда приложение переходит в фоновый режим и показывает тост, используя класс SmartToast
public class SmartToast {
static ArrayList<WeakReference<Toast>> toasts = new ArrayList<>();
public static void showToast(@NonNull Context context,@NonNull String message){
//this will not allowed to show toast when app in background
if(App.inBackground) return;
Toast toast = Toast.makeText(context,message,Toast.LENGTH_SHORT);
toasts.add(new WeakReference<>(toast));
toast.show();
//clean up WeakReference objects itself
ArrayList<WeakReference<Toast>> nullToasts = new ArrayList<>();
for (WeakReference<Toast> weakToast : toasts) {
if(weakToast.get() == null) nullToasts.add(weakToast);
}
toasts.remove(nullToasts);
}
public static void cancelAll(){
for (WeakReference<Toast> weakToast : toasts) {
if(weakToast.get() != null) weakToast.get().cancel();
}
toasts.clear();
}
}
вызывать метод SmartToast.cancelAll();
, когда приложение переходит в фоновый режим, чтобы скрыть текущий и все ожидающие тосты. Код - это весело. Наслаждайтесь!
Ответ 13
Здесь, как отключить сообщения для тостов, удалите выражение show()
.
//Disable notification message
Toast.makeText(this,"Message",Toast.LENGTH_SHORT);
//Enable notification message
Toast.makeText(this,"Message",Toast.LENGTH_SHORT).show();