PDA

Ver la Versión Completa : Toast personalizado ayuda


ugarte
22/02/13, 18:35:53
Buenas! llevo ya varias horas buscando el fallo y no soy capaz de encontrarlo.
Quiero que en mi aplicación cuando pase determinada cosa aparezca un Toast personalizado con un XML para informarme de que se ha desbloqueado un logro.
Haciendo el toast por defecto no hay problema:

XML del Toast toast_layout.xml:
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="horizontal"
android:id="@+id/toast_layout_root"
android:background="#555555"
android:padding="5dip" >

<ImageView
android:id="@+id/imgLogro"
android:layout_width="55dp"
android:layout_height="55dp"
android:src="@drawable/oro"/>

<LinearLayout
android:layout_width="match_parent"
android:layout_height="55dp"
android:orientation="vertical"
android:layout_marginLeft="10dp"
android:gravity="center_vertical" >

<TextView
android:id="@+id/txtTitulo"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="Logro desbloqueado"
android:textSize="20dp"
android:textColor="#fff"/>

<TextView
android:id="@+id/txtSubtitulo"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="Información sobre el logro"
android:textSize="14dp"
android:textColor="#fff" />

</LinearLayout>
</LinearLayout>


Instrucción:

btn.setOnClickListener(new OnClickListener() {

@Override
public void onClick(View v) {
LayoutInflater inflater = getLayoutInflater();
View layout = inflater.inflate(R.layout.toast_layout, (ViewGroup) findViewById(R.id.toast_layout_root));

Toast toast = new Toast(getApplicationContext());
toast.setGravity(Gravity.CENTER, 0, 0);
toast.setDuration(Toast.LENGTH_LONG);
toast.setView(layout);
toast.show();
}
});


El problema es cuando intento modificar los atributos de los elementos que hay en el XML desde código:
public void onClick(View v) {
notificacion(1, "El comienzo", "Consigue el primer acierto");
}

...........

public void notificacion(int tipo, String titulo, String subTitulo) {


ImageView imgLogro = (ImageView)findViewById(R.id.imgLogro);
TextView txtTitulo = (TextView)findViewById(R.id.txtTitulo);
TextView txtSubTitulo = (TextView)findViewById(R.id.txtSubtitulo);

switch (tipo) {
case 1: imgLogro.setImageResource(R.drawable.bronce); break;
case 2: imgLogro.setImageResource(R.drawable.plata); break;
case 3: imgLogro.setImageResource(R.drawable.oro); break;
}
txtTitulo.setText(titulo);
txtSubTitulo.setText(subTitulo);

LayoutInflater inflater = getLayoutInflater();
View layout = inflater.inflate(R.layout.toast_layout, (ViewGroup) findViewById(R.id.toast_layout_root));


Toast toast = new Toast(getApplicationContext());
toast.setGravity(Gravity.CENTER, 0, 0);
toast.setDuration(Toast.LENGTH_LONG);
toast.setView(layout);
toast.show();
}

rinxe
22/02/13, 20:31:59
Me suena a mi que para inflar una vista primero tienes que declarar el Layoutinflater
LayoutInflater inflater = activity.getLayoutInflater();
View layout = inflater.inflate(R.layout.toast_layout, null);

Luego crear los objetos de esa vista, fijate que se pone "layout." delante de findViewById
ImageView imgLogro = (ImageView) layout.findViewById(R.id.imgLogro);
TextView txtTitulo = (TextView) layout.findViewById(R.id.txtTitulo);
TextView txtSubTitulo = (TextView) layout.findViewById(R.id.txtSubtitulo);

Una vez hecho eso ya puede usar los metodos setImageResource o setText.

Y para terminar devuelves la View: toast.setView(layout);

Prueba haber si te funciona.

ugarte
23/02/13, 15:00:37
Efectivamente, funciona. Estuve pensando en esa solución y al final no la probé. Gracias