miércoles, 22 de enero de 2014

Un poco de Android

Hoy es el día de hacer una pequeña pausa en el blog para resolver una duda que encontré sobre programación en Android.

La idea es pasar una imagen dibujada en un lienzo de una actividad A a otra actividad B (como Bitmap). Como no he encontrado la solución explícita en la web, he decidido publicarla y evitar pérdidas de tiempo en el futuro.

En la actividad A vamos a tener el lienzo.  Primero creamos en el fichero XML correspondiente a esta actividad nuestro botón de "Aceptar", o "Enviar". Después ponemos en las propiedades del lienzo el nombre de la siguiente función en la pestaña "onClick". Quedaría así:


Otra opción sería añadir la línea correspondiente al botón de XML. En mi caso, quedaría así:
<Button
            android:id="@+id/button1"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:onClick="lanzarTexto"
            android:text="@string/aceptar" />

Ahora volvemos a nuestra actividad A. En ella, meteremos el siguiente código:

public void lanzarTexto(View v) {

drawView.setDrawingCacheEnabled(true); //Para poder obtener la imagen del lienzo
Bitmap bitmap = drawView.getDrawingCache(); //Cojo el lienzo y lo paso a formato Bitmap
Bundle b = new Bundle(); //Creo un contenedor Bundle
Intent i = new Intent(this, Texto.class); //Intent para pasar a la actividad Texto cuando pulse el botón
ByteArrayOutputStream bs = new ByteArrayOutputStream(); //Creo un ByteArray y convierto el Bitmap a este formato
bitmap.compress(Bitmap.CompressFormat.PNG, 50, bs);
b.putByteArray("nombre", bs.toByteArray()); //Pongo el ByteArray en el Bundle con el id "nombre"
i.putExtras(b); //y lo envío cuando pulse el botón
        startActivity(i);

}

Ya sólo queda recibir la imagen de la actividad y meterla en nuestro ImageView. Abrimos la actividad B, y dentro del método onCreate, incorporamos el siguiente código:

@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_texto);

//RECIBIR IMAGEN DESDE MainActivity
//Desde esta actividad, recibo el lienzo en formato ByteArray desde la actividad MainActivity con el id "nombre" (lo recibo en un contenedor bundle)
// y decodifico a formato Bitmap. Ese Bitmap lo llevo a mi botón ImageView llamado imagebtn1
Bundle parametros = this.getIntent().getExtras();
ImageView previewThumbnail=(ImageView) findViewById(R.id.imagebtn1);

Bitmap b = BitmapFactory.decodeByteArray(parametros.getByteArray("nombre"),0,parametros.getByteArray("nombre").length);
previewThumbnail.setImageBitmap(b);


    }
* El imageView que crearemos en el XML de la actividad B debe llamarse imagebtn1.

Con esto, ya debe funcionar. Cuando pasamos a la actividad B, va a coger automáticamente la imagen de la actividad A.