utilizar usar studio example como agregar android android-toast

android - usar - toast in fragment



Cómo evitar un brindis si ya se muestra una tostada (8)

Una solución combinada

Para mi caso, necesitaba cancelar la tostada actual si se muestra y mostrar otra.

Esto fue para resolver el escenario cuando el usuario solicita un servicio mientras todavía está cargando o no está disponible. Necesito mostrar un brindis (podría ser diferente si el servicio solicitado es diferente). De lo contrario, los brindis seguirán mostrándose en orden y llevará mucho tiempo esconderlos automáticamente.

Básicamente, guardo la instancia de la tostada que estoy creando y el siguiente código es cómo cancelarlo de manera segura.

synchronized public void cancel() { if(toast == null) { Log.d(TAG, "cancel: toast is null (occurs first time only)" ); return; } final View view = toast.getView(); if(view == null){ Log.d(TAG, "cancel: view is null"); return; } if (view.isShown()) { toast.cancel(); }else{ Log.d(TAG, "cancel: view is already dismissed"); } }

Y para usarlo ahora no puedo preocuparme por cancelar como en:

if (toastSingleton != null ) { toastSingleton.cancel(); toastSingleton.showToast(messageText); }else{ Log.e(TAG, "setMessageText: toastSingleton is null"); }

El showToast depende de usted cómo implementarlo ya que necesitaba un aspecto personalizado para mi tostada.

Tengo varios SeekBar y onSeekBarProgressStop() , quiero mostrar un mensaje de Toast .

Pero si en SeekBar realizo la acción rápidamente, la interfaz de usuario enhebra de alguna manera los bloques y el mensaje de Toast espera hasta que el hilo de la interfaz de usuario esté libre.

Ahora mi preocupación es evitar el nuevo mensaje Toast si el mensaje Toast ya se está mostrando. ¿O es su condición por la que verificamos que el hilo de la interfaz de usuario es actualmente libre, entonces mostraré el mensaje de Toast .

Lo intenté de ambas maneras, usando runOnUIThread() y también creando un nuevo Handler .


Bueno para detener el apilamiento, por ejemplo, haga clic en tostadas. Basado en la respuesta de @ Addi.

public Toast toast = null; //.... public void favsDisplay(MenuItem item) { if(toast == null) // first time around { Context context = getApplicationContext(); CharSequence text = "Some text..."; int duration = Toast.LENGTH_SHORT; toast = Toast.makeText(context, text, duration); } try { if(toast.getView().isShown() == false) // if false not showing anymore, then show it toast.show(); } catch (Exception e) {} }


Compruebe si aparece el mensaje de tostado en la pantalla, ya sea que se muestre o no. Para mostrar un mensaje de brindis Haga una clase por separado. Y use el método de esta clase que muestra el mensaje de brindis después de verificar la visibilidad del mensaje de brindis. Use este fragmento de código:

public class AppToast { private static Toast toast; public static void showToast(Context context, String message) { try { if (!toast.getView().isShown()) { toast=Toast.makeText(context, message, Toast.LENGTH_SHORT); toast.show(); } } catch (Exception ex) { toast=Toast.makeText(context,message,Toast.LENGTH_SHORT); toast.show(); } } }

Espero que esta solución te ayude.

Gracias


He intentado una variedad de cosas para hacer esto. Al principio intenté usar cancel() , que no tuvo ningún efecto para mí (ver también esta respuesta ).

Con setDuration(n) tampoco venía a ningún lado. Resultó registrando getDuration() que lleva un valor de 0 (si el makeText() era Toast.LENGTH_SHORT ) o 1 (si el makeText() era Toast.LENGTH_LONG ).

Finalmente, traté de verificar si la vista de las tostadas es isShown() . Por supuesto, no es si no se muestra una tostada, pero aún más, devuelve un error fatal en este caso. Así que tuve que intentar atrapar el error. Ahora, isShown() devuelve verdadero si se muestra una tostada. Utilizando isShown() me ocurrió el método:

/** * <strong>public void showAToast (String st)</strong></br> * this little method displays a toast on the screen.</br> * it checks if a toast is currently visible</br> * if so </br> * ... it "sets" the new text</br> * else</br> * ... it "makes" the new text</br> * and "shows" either or * @param st the string to be toasted */ public void showAToast (String st){ //"Toast toast" is declared in the class try{ toast.getView().isShown(); // true if visible toast.setText(st); } catch (Exception e) { // invisible if exception toast = Toast.makeText(theContext, st, toastDuration); } toast.show(); //finally display it }


La función mejorada del hilo anterior, que mostrará las tostadas solo si no está visible con el mismo mensaje de texto:

public void showSingleToast(){ try{ if(!toast.getView().isShown()) { toast.show(); } } catch (Exception exception) { exception.printStackTrace(); Log.d(TAG,"Toast Exception is "+exception.getLocalizedMessage()); toast = Toast.makeText(this.getActivity(), getContext().getString(R.string.no_search_result_fou`enter code here`nd), Toast.LENGTH_SHORT); toast.show(); } }


La siguiente es una solución alternativa a la respuesta más popular , sin try / catch.

public void showAToast (String message){ if (mToast != null) { mToast.cancel(); } mToast = Toast.makeText(this, message, Toast.LENGTH_SHORT); mToast.show(); }


Una solución limpia que funciona de la caja. Defina esto en tu Actividad:

private Toast toast; /** * Use this to prevent multiple Toasts from spamming the UI for a long time. */ public void showToast(CharSequence text, int duration) { if (toast == null) toast = Toast.makeText(this, text, duration); else toast.setText(text); toast.show(); } public void showToast(int resId, int duration) { showToast(getResources().getText(resId), duration); }


lleve un registro de la última vez que mostró el brindis, y vuelva a mostrarlo como no-operativo si cae dentro de algún intervalo.

public class RepeatSafeToast { private static final int DURATION = 4000; private static final Map<Object, Long> lastShown = new HashMap<Object, Long>(); private static boolean isRecent(Object obj) { Long last = lastShown.get(obj); if (last == null) { return false; } long now = System.currentTimeMillis(); if (last + DURATION < now) { return false; } return true; } public static synchronized void show(Context context, int resId) { if (isRecent(resId)) { return; } Toast.makeText(context, resId, Toast.LENGTH_LONG).show(); lastShown.put(resId, System.currentTimeMillis()); } public static synchronized void show(Context context, String msg) { if (isRecent(msg)) { return; } Toast.makeText(context, msg, Toast.LENGTH_LONG).show(); lastShown.put(msg, System.currentTimeMillis()); } }

y entonces,

RepeatSafeToast.show(this, "Hello, toast."); RepeatSafeToast.show(this, "Hello, toast."); // won''t be shown RepeatSafeToast.show(this, "Hello, toast."); // won''t be shown RepeatSafeToast.show(this, "Hello, toast."); // won''t be shown

esto no es perfecto, ya que la duración de LENGTH_SHORT y LENGTH_LONG no está definida, pero funciona bien en la práctica. tiene la ventaja sobre otras soluciones que no necesita mantener en el objeto Toast y la sintaxis de la llamada sigue siendo breve.