"(ViewGroup) findViewById (R.id.toast_layout_root)" se puede reemplazar por "null". Debido a que su actividad no contiene toast_layout, siempre será nulo de todos modos.
stevo.mit
2
Mi tostada personalizada no aparecía porque estaba usando el nuevo Diseño de restricción como vista raíz de mi tostada personalizada. Una vez que cambié a Diseño lineal, todo funcionó perfectamente. Así que ten cuidado ...
Charles Woodson
¿realmente alguien podría explicar el propósito de findViewById (R.id.toast_layout_root)? será nulo de todos modos, y funciona perfectamente bien con solo pasar nulo
use esto si falla por findViewById es nulo: View layout = inflater.inflate (R.layout.toast_layout, null);
Bita Mirshafiee
38
Un brindis es para mostrar mensajes durante breves intervalos de tiempo; Entonces, según tengo entendido, le gustaría personalizarlo agregando una imagen y cambiando el tamaño y el color del texto del mensaje. Si eso es todo lo que desea hacer, entonces no es necesario hacer un diseño separado e inflarlo a la instancia de Toast.
La vista predeterminada de Toast contiene un TextViewmensaje para mostrar mensajes. Entonces, si tenemos la referencia de id de recurso de eso TextView, podemos jugar con él. Entonces, a continuación, se muestra lo que puede hacer para lograr esto:
Toast toast =Toast.makeText(this,"I am custom Toast!",Toast.LENGTH_LONG);View toastView = toast.getView();// This'll return the default View of the Toast./* And now you can get the TextView of the default View of the Toast. */TextView toastMessage =(TextView) toastView.findViewById(android.R.id.message);
toastMessage.setTextSize(25);
toastMessage.setTextColor(Color.RED);
toastMessage.setCompoundDrawablesWithIntrinsicBounds(R.mipmap.ic_fly,0,0,0);
toastMessage.setGravity(Gravity.CENTER);
toastMessage.setCompoundDrawablePadding(16);
toastView.setBackgroundColor(Color.CYAN);
toast.show();
En el código anterior que puede ver, puede agregar una imagen a TextView a través de setCompoundDrawablesWithIntrinsicBounds(int left, int top, int right, int bottom)cualquier posición relativa a TextView que desee.
Hay muchas menos posibilidades de que esto suceda, pero aún así, creo que TextViewdebería haber un cheque para eso , solo para estar seguro y por un cheque, me refiero a un cheque nulo o un cheque de tipo. Por si acaso, Google decide cambiar la identificación o la vista para mostrar texto en la clase Toast. De todos modos ... +1
DroidDev
1
¡Cierto! Pero si se cambia, no podrá acceder a la identificación del recurso de todos modos debido a que no existe. Pero a pesar de que para estar seguro, un cheque NULO le facilitaría la vida. @DroidDev gracias por la sugerencia :)
TheLittleNaruto
16
PASO 1:
Primero cree un diseño para un brindis personalizado en res/layout/custom_toast.xml:
PASO 2: En el código de actividad, obtenga la vista personalizada anterior y adjúntela a Toast:
// Get your custom_toast.xml ayoutLayoutInflater inflater = getLayoutInflater();View layout = inflater.inflate(R.layout.custom_toast,(ViewGroup) findViewById(R.id.custom_toast_layout_id));// set a messageTextView text =(TextView) layout.findViewById(R.id.text);
text.setText("Button is clicked!");// Toast...Toast toast =newToast(getApplicationContext());
toast.setGravity(Gravity.CENTER_VERTICAL,0,0);
toast.setDuration(Toast.LENGTH_LONG);
toast.setView(layout);
toast.show();
Para obtener más ayuda, vea cómo creamos Toast personalizado en Android:
Ver enlace aquí . Encuentra tu solución. Y prueba:
Creación de una vista de brindis personalizada
Si un simple mensaje de texto no es suficiente, puede crear un diseño personalizado para su notificación de brindis. Para crear un diseño personalizado, defina un diseño de Vista, en XML o en el código de su aplicación, y pase el objeto Ver raíz al método setView (Vista).
Por ejemplo, puede crear el diseño para el brindis visible en la captura de pantalla a la derecha con el siguiente XML (guardado como toast_layout.xml):
Tenga en cuenta que el ID del elemento LinearLayout es "toast_layout". Debe usar este ID para inflar el diseño del XML, como se muestra aquí:
LayoutInflater inflater = getLayoutInflater();View layout = inflater.inflate(R.layout.toast_layout,(ViewGroup) findViewById(R.id.toast_layout_root));ImageView image =(ImageView) layout.findViewById(R.id.image);
image.setImageResource(R.drawable.android);TextView text =(TextView) layout.findViewById(R.id.text);
text.setText("Hello! This is a custom toast!");Toast toast =newToast(getApplicationContext());
toast.setGravity(Gravity.CENTER_VERTICAL,0,0);
toast.setDuration(Toast.LENGTH_LONG);
toast.setView(layout);
toast.show();
Primero, recupere LayoutInflater con getLayoutInflater () (o getSystemService ()), y luego infle el diseño de XML usando inflate (int, ViewGroup). El primer parámetro es el ID del recurso de diseño y el segundo es la vista raíz. Puede usar este diseño inflado para encontrar más objetos View en el diseño, así que ahora capture y defina el contenido de los elementos ImageView y TextView. Finalmente, cree un nuevo brindis con tostado (contexto) y establezca algunas propiedades del brindis, como la gravedad y la duración. Luego llame a setView (View) y páselo al diseño inflado. Ahora puede mostrar el brindis con su diseño personalizado llamando a show ().
Nota: No utilice el constructor público para un Toast a menos que vaya a definir el diseño con setView (Ver). Si no tiene un diseño personalizado para usar, debe usar makeText (Context, int, int) para crear el Toast.
Creo que la mayoría de los ejemplos xml de customtoast en Internet se basan en la misma fuente.
La documentación de Android, que en mi opinión está muy desactualizada. fill_parent no debería usarse más. Prefiero usar wrap_content en combinación con un xml.9.png. De esa forma, puede definir el tamaño mínimo de toastbackground en todo el tamaño de la fuente proporcionada.
Si se requieren tostadas más complejas, se debe usar un marco o un diseño relativo en lugar de LL.
Para evitar problemas con los parámetros de layout_ * que no se utilizan correctamente, debe asegurarse de que, cuando infle su diseño personalizado, especifique un ViewGroup correcto como padre.
Muchos ejemplos pasan nulos aquí, pero en su lugar puede pasar el Toast ViewGroup existente como su padre.
val toast =Toast.makeText(this,"",Toast.LENGTH_LONG)
val layout =LayoutInflater.from(this).inflate(R.layout.view_custom_toast, toast.view.parent as?ViewGroup?)
toast.view = layout
toast.show()
Aquí reemplazamos la vista Toast existente con nuestra vista personalizada. Una vez que tenga una referencia al "diseño" de su diseño, puede actualizar cualquier vista de imágenes / texto que pueda contener.
Esta solución también evita que cualquier "Vista no adjunta al administrador de ventanas" se bloquee al usar null como padre.
Además, evite usar ConstraintLayout como su raíz de diseño personalizado, esto parece no funcionar cuando se usa dentro de un Toast.
Código para el archivo de diseño activity_main.xml.
<RelativeLayoutxmlns:android="http://schemas.android.com/apk/res/android"xmlns:tools="http://schemas.android.com/tools"android:layout_width="match_parent"android:layout_height="match_parent"android:paddingBottom="@dimen/activity_vertical_margin"android:paddingLeft="@dimen/activity_horizontal_margin"android:paddingRight="@dimen/activity_horizontal_margin"android:paddingTop="@dimen/activity_vertical_margin"tools:context="com.android_examples.com.toastbackgroundcolorchange.MainActivity"><Buttonandroid:id="@+id/button1"android:layout_width="wrap_content"android:layout_height="wrap_content"android:layout_centerHorizontal="true"android:layout_centerVertical="true"android:text="CLICK HERE TO SHOW TOAST MESSAGE WITH DIFFERENT BACKGROUND COLOR INCLUDING BORDER"/></RelativeLayout>
Código para el archivo de diseño toast_background_color.xml creado en la carpeta res-> layout.
Los brindis personalizados en segundo plano están bloqueados, Android 11 protege a los usuarios al desaprobar las vistas de brindis personalizadas. Por razones de seguridad y para mantener una buena experiencia de usuario, el sistema bloquea los avisos que contienen vistas personalizadas si esos avisos son enviados desde el fondo por una aplicación que tiene como objetivo Android 11.
Método addCallback () agregado en Android R Si desea que se le notifique cuando un brindis (texto o personalizado) aparece o desaparece.
El texto más importante en la API de tostadas cambia que para las aplicaciones que tienen como objetivo Android 11, el getView()método devuelve nulo cuando accedes a él, así que asegúrate de proteger tus aplicaciones de FATAL EXCEPTION, ya sabes a qué me refiero :)
Respuestas:
Utilice el siguiente código de un brindis personalizado. Puede que te ayude.
toast.xml
MainActivity.java
Y consulte los enlaces a continuación también para obtener un brindis personalizado.
Brindis personalizado con reloj analógico
YouTube: Creación de un brindis personalizado con botón en Android Studio
fuente
Un brindis es para mostrar mensajes durante breves intervalos de tiempo; Entonces, según tengo entendido, le gustaría personalizarlo agregando una imagen y cambiando el tamaño y el color del texto del mensaje. Si eso es todo lo que desea hacer, entonces no es necesario hacer un diseño separado e inflarlo a la instancia de Toast.
La vista predeterminada de Toast contiene un
TextView
mensaje para mostrar mensajes. Entonces, si tenemos la referencia de id de recurso de esoTextView
, podemos jugar con él. Entonces, a continuación, se muestra lo que puede hacer para lograr esto:En el código anterior que puede ver, puede agregar una imagen a TextView a través de
setCompoundDrawablesWithIntrinsicBounds(int left, int top, int right, int bottom)
cualquier posición relativa a TextView que desee.Actualizar:
Haber escrito una clase de constructor para simplificar el propósito anterior; Aquí está el enlace: https://gist.github.com/TheLittleNaruto/6fc8f6a2b0d0583a240bd78313ba83bc
Consulte el
HowToUse.kt
enlace de arriba.Salida:
fuente
TextView
debería haber un cheque para eso , solo para estar seguro y por un cheque, me refiero a un cheque nulo o un cheque de tipo. Por si acaso, Google decide cambiar la identificación o la vista para mostrar texto en la clase Toast. De todos modos ... +1PASO 1:
Primero cree un diseño para un brindis personalizado en
res/layout/custom_toast.xml
:PASO 2: En el código de actividad, obtenga la vista personalizada anterior y adjúntela a Toast:
Para obtener más ayuda, vea cómo creamos Toast personalizado en Android:
http://developer.android.com/guide/topics/ui/notifiers/toasts.html
fuente
Ver enlace aquí . Encuentra tu solución. Y prueba:
Creación de una vista de brindis personalizada
Si un simple mensaje de texto no es suficiente, puede crear un diseño personalizado para su notificación de brindis. Para crear un diseño personalizado, defina un diseño de Vista, en XML o en el código de su aplicación, y pase el objeto Ver raíz al método setView (Vista).
Por ejemplo, puede crear el diseño para el brindis visible en la captura de pantalla a la derecha con el siguiente XML (guardado como toast_layout.xml):
Tenga en cuenta que el ID del elemento LinearLayout es "toast_layout". Debe usar este ID para inflar el diseño del XML, como se muestra aquí:
Primero, recupere LayoutInflater con getLayoutInflater () (o getSystemService ()), y luego infle el diseño de XML usando inflate (int, ViewGroup). El primer parámetro es el ID del recurso de diseño y el segundo es la vista raíz. Puede usar este diseño inflado para encontrar más objetos View en el diseño, así que ahora capture y defina el contenido de los elementos ImageView y TextView. Finalmente, cree un nuevo brindis con tostado (contexto) y establezca algunas propiedades del brindis, como la gravedad y la duración. Luego llame a setView (View) y páselo al diseño inflado. Ahora puede mostrar el brindis con su diseño personalizado llamando a show ().
Nota: No utilice el constructor público para un Toast a menos que vaya a definir el diseño con setView (Ver). Si no tiene un diseño personalizado para usar, debe usar makeText (Context, int, int) para crear el Toast.
fuente
Diseño personalizado para la tostada,
custom_toast.xml
:Y el método Java (simplemente pase el mensaje tostado a este método):
fuente
Puede descargar el código aquí .
Paso 1:
Paso 2:
Paso 3:
fuente
Creo que la mayoría de los ejemplos xml de customtoast en Internet se basan en la misma fuente.
La documentación de Android, que en mi opinión está muy desactualizada. fill_parent no debería usarse más. Prefiero usar wrap_content en combinación con un xml.9.png. De esa forma, puede definir el tamaño mínimo de toastbackground en todo el tamaño de la fuente proporcionada.
Si se requieren tostadas más complejas, se debe usar un marco o un diseño relativo en lugar de LL.
toast.xml
background.xml
background_96 es background_96.9.png.
Esto no se prueba muy bien y se agradecen las sugerencias :)
fuente
Para evitar problemas con los parámetros de layout_ * que no se utilizan correctamente, debe asegurarse de que, cuando infle su diseño personalizado, especifique un ViewGroup correcto como padre.
Muchos ejemplos pasan nulos aquí, pero en su lugar puede pasar el Toast ViewGroup existente como su padre.
Aquí reemplazamos la vista Toast existente con nuestra vista personalizada. Una vez que tenga una referencia al "diseño" de su diseño, puede actualizar cualquier vista de imágenes / texto que pueda contener.
Esta solución también evita que cualquier "Vista no adjunta al administrador de ventanas" se bloquee al usar null como padre.
Además, evite usar ConstraintLayout como su raíz de diseño personalizado, esto parece no funcionar cuando se usa dentro de un Toast.
fuente
Esto es lo que usé
AllMethodsInOne.java
YourFile.java
Mientras llama, escriba a continuación.
fuente
Código para el archivo MainActivity.java.
Código para el archivo de diseño activity_main.xml.
Código para el archivo de diseño toast_background_color.xml creado en la carpeta res-> layout.
fuente
// Una clase de tostadas personalizadas donde puede mostrar tostadas personalizadas o predeterminadas según lo desee)
fuente
Manera sencilla de personalizar el brindis,
fuente
Para todos los usuarios de Kotlin
Puede crear una extensión como la siguiente:
fuente
Es muy sencillo crear nuestra propia costumbre
Toast
.Simplemente siga los pasos a continuación.
Paso 1
Cree el diseño personalizado que desee
Paso 2
Ahora cree la clase personalizada que se extiende con
Toast
.Hemos creado el brindis personalizado.
Paso 3
Ahora, finalmente, ¿cómo podemos usarlo?
¡¡Disfrutar!!
fuente
Atención, actualizaciones de brindis en Android 11
Método addCallback () agregado en Android R Si desea que se le notifique cuando un brindis (texto o personalizado) aparece o desaparece.
El texto más importante en la API de tostadas cambia que para las aplicaciones que tienen como objetivo Android 11, el
getView()
método devuelve nulo cuando accedes a él, así que asegúrate de proteger tus aplicaciones de FATAL EXCEPTION, ya sabes a qué me refiero :)fuente
Al usar esta biblioteca llamada Toasty , creo que tiene suficiente flexibilidad para hacer un brindis personalizado con el siguiente enfoque:
También puede pasar texto formateado a Toasty y aquí está el fragmento de código
fuente
Referencia: https://developer.android.com/guide/topics/ui/notifiers/toasts
fuente