Mensaje de tostada persistente: La tostada no desaparecerá después de la ejecución
Tengo un mensaje de brindis que no desaparece después de la ejecución. Supongo que tiene algo que ver con que esté en el bucle, pero no estoy seguro. ¿Puede alguien ayudarme a averiguar por qué el mensaje de brindis no es dispares?
@Override public void onClick(View v) { int index = 0; for(int i= 0; i<userArray.length; i++){ if(email.getText().toString().equals(userArray[i])){ index = i; } if(passArray[index].equals(password.getText().toString())){ Toast.makeText(getBaseContext(), "SUCCESS!", Toast.LENGTH_SHORT).show(); } else { Toast.makeText(getBaseContext(), "INVALID LOGIN", Toast.LENGTH_SHORT).show(); } } Intent mainIntent = new Intent(LoginActivity.this, MainActivity.class); startActivityForResult(mainIntent, 0); }
}
- Android cancela Toast al salir de la aplicación y cuando se muestra el brindis
- Valor siempre devuelve 0 donde debe devolver el número de fila insertada
- ¿De dónde viene esta tostada?
- Cómo utilizar Tostadas cuando no puedo usar "esto" como contexto
- ¿Cómo puede obtener la luz azul halo de una tostada en mi tostada personalizado también?
- Cómo configurar el estilo tostado como tema?
- ¿Cómo dejar de mostrar el mensaje de Toast cuando la aplicación está cerrada?
- Incompatibilidad de tipo: no se puede convertir void to toast
- Cómo cambiar la posición de Toast en Android?
- Problema de brindis en android
- Android: Cómo configurar el color del texto de un Toast
- Ocultar toast
- Alternativa al uso de tostadas
Un mensaje Toast puede quedar bloqueado si lo llama desde un subproceso de servicio y ese subproceso finaliza su trabajo antes de que Toast esté configurado para desaparecer. A continuación, quedará atascado con el mensaje Toast en la pantalla hasta que mate la aplicación.
Toast
siempre desaparece. Siempre.
Por lo tanto, está mostrando varios mensajes Toast. Garantizado. Pruebe esto cambiando los mensajes con algún tipo de contador o inhabilitando después de que se muestre el inicial.
Tenga en cuenta que un buen número de tostadas puede apilar y tomar un tiempo loooooong para terminar de mostrar espalda con espalda. Espera y eventualmente desaparecerán siempre y cuando tu aplicación no esté en bucle indefinidamente.
Edición: I stant corregido. Aparentemente, los mensajes Toast
pueden quedarse atascados y permanecer visualizados si se inician desde un Thread, Service o IntentService. Gracias @ Johnathan y @zapotec.
Un Toast
no siempre desaparece.
"Si lo llamas desde un subproceso de servicio y ese hilo finaliza su trabajo antes de que Toast esté configurado para desaparecer, te quedarás atascado con el mensaje Toast en la pantalla hasta que acabes con la aplicación."
(copiado de la respuesta original por Jonathan Cole , que desafortunadamente fue eliminado)
A continuación, se muestra un seguimiento de la pila de muestra que explica cómo puede ocurrir la situación:
java.lang.IllegalStateException: Handler (android.os.Handler) {123f93ea} sending message to a Handler on a dead thread at android.os.MessageQueue.enqueueMessage(MessageQueue.java:325) at android.os.Handler.enqueueMessage(Handler.java:631) at android.os.Handler.sendMessageAtTime(Handler.java:600) at android.os.Handler.sendMessageDelayed(Handler.java:570) at android.os.Handler.post(Handler.java:326) at android.widget.Toast$TN.hide(Toast.java:387) at android.widget.Toast.cancel(Toast.java:133)
Hay algunos casos raros que el pan tostado no desaparecerá. Con el fin de manejar esto, sólo tiene que utilizar el controlador. Crear uno como un campo, y el uso "post (Runnable)" con el brindis que se muestra allí.
Tuve este problema. Lo que encontré es que instancié más de 10 tostadas. Cada uno esperó hasta que el siguiente desapareció antes de mostrar el siguiente, con un total de 20 segundos en la pantalla.
Me pareció que el almacenamiento de todos los brindis en un arraylist, a continuación, cancelar todos ellos arreglar mi problema.
private ArrayList<Toast> toasts; public void sendToast(final String message) { if (null == toasts) { toasts = new ArrayList<Toast>(); } runOnUiThread(new Runnable() { @Override public void run() { try { Toast toast = Toast.makeText(NJActivity.this, message, Toast.LENGTH_SHORT); toast.setGravity(Gravity.TOP|Gravity.CENTER, 0, 300); toast.show(); toasts.add(toast); } catch(Exception e) {/* do nothing, just means that the activity doesn't exist anymore*/} } }); } public void removeToast() { runOnUiThread(new Runnable() { @Override public void run() { if (null != toasts) { for(Toast toast:toasts) { toast.cancel(); } toasts = null; } } }); }
Entonces en destruir en parada llamé el método de removeToast ()
@Override public void onDestroy() { super.onDestroy(); removeToast(); } @Override protected void onStop () { super.onStop(); removeToast(); }
Aquí está mi solución con un controlador de tostadas personalizado. Funciona perfectamente en mapp.
public class CustomToast { private LayoutInflater inflater; private Toast toast; private View customToastLayout; private TextView LblCustomToast; public CustomToast() {} public void showCustomToast(String toastMessage, int toastLength, AppCompatActivity context) { if(inflater == null) {inflater = context.getLayoutInflater();} if(customToastLayout == null) {customToastLayout = inflater.inflate(R.layout.toast_layout, (ViewGroup) context.findViewById(R.id.toast_layout_root));} if(LblCustomToast == null) {LblCustomToast = (TextView) customToastLayout.findViewById(R.id.LblCustomToast);} LblCustomToast.setText(toastMessage); if(toast == null) {toast = new Toast(context);} toast.setGravity(Gravity.CENTER_VERTICAL| Gravity.BOTTOM, 0, DPDensity.getPxFromDP(160, context.getResources())); toast.setDuration(toastLength); toast.setView(customToastLayout); if(toast.getView().isShown()) {toast.cancel();}//Toast is cancelled here if currently showing toast.show(); } }
Aquí está el diseño XML
<?xml version="1.0" encoding="utf-8"?> <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:id="@+id/toast_layout_root" android:layout_width="wrap_content" android:layout_height="wrap_content" android:paddingLeft="15dp" android:paddingTop="5dp" android:paddingRight="15dp" android:paddingBottom="5dp" android:orientation="vertical" android:background="@drawable/custom_toast_bg" android:gravity="bottom|center" android:layout_marginBottom="50dp"> <TextView android:id="@+id/LblCustomToast" android:text="Test" android:textSize="16dp" android:layout_width="wrap_content" android:layout_height="wrap_content" android:textColor="@color/lightLime" android:layout_gravity="center" android:gravity="center"/> </LinearLayout>
Y aquí está el uso:
customToast = new CustomToast(); customToast.showCustomToast(getString(R.string.your_message), Toast.LENGTH_SHORT, (AppCompatActivity) mainActivityContext);
I m guessing it has something to do with it being in the loop but I'm not sure.
Sí, usted tiene razón de su beacause apariencia que usted ha mantenido en el bucle for
lo que muchas veces el bucle se ejecutará que muchas veces el Toast
aparecerá.
Estás mostrando el Toast varias veces en tu código.
Yo sería mejor si su no quiere tostadas varias veces, entonces usted puede escribir a cabo el lado de la bucle.
Creo que el tema es brindis está apareciendo una y otra vez en la pantalla y su tomar el tiempo para despedir. Compruebe su código bye poniendo el bucle exterior tostada y también comprobar si las condiciones son verdaderas varias veces. En resumen, sólo DEBUG
su código.
El pan tostado se queda un poco más largo. Siempre desaparecerá una vez generado. Como en bucle que se generan continuamente sobre sí, por lo que le da la ilusión de estar allí siempre. si va a seguir siendo paciente y esperar un poco largo todo desaparecerá después de algún tiempo.
Si desea mostrar el mensaje de éxito.
Trate de hacer el alert dialogue
y mantener en la actualización de su mensaje en algunos Text View
el mensaje de éxito que desea mostrar en el éxito y el fracaso.
o intenta elevar Toast
sólo cuando falla al iniciar sesión.
O compruebe Infintie Loop
si desea seguir el mismo enfoque