2011-11-07 12 views
10

Tengo una matriz de bytes que contiene una imagen extraída de la red. Los estoy cargando de forma perezosa en mi actividad de IU (o estoy intentando al menos: D) usando Bitmapfactory, BitmapDrawable y setImageDrawable. aquí está mi código:setImageBitmap no tiene efecto visible

RelativeLayout r =(RelativeLayout) adap.getGroupView(Integer.parseInt(groupPos), false, null, null); 
ImageView iv = (ImageView) r.findViewById(R.id.imgGruppo); 
Log.w("",""+raw_img.length); 
Bitmap bm = BitmapFactory.decodeByteArray(raw_img, 0, raw_img.length); 
Drawable drawable = new BitmapDrawable(bm); 
Log.i("","pre setimage"); 
iv.setImageDrawable(drawable); 
//added for testing only, with no effects. 
//((ELA) Activity_Titoli_2.this.getExpandableListAdapter()).notifyDataSetChanged(); 
//ELA is my expandable list adapter 
Log.i("","post setimage"+bm.getRowBytes()); //just to see that i have actual data in raw_img and such 

aquí es el XML involucrados

<?xml version="1.0" encoding="utf-8"?> 
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" 
    android:id="@+id/linearLayoutTitoli2_gruppo" 
    android:layout_width="fill_parent" 
    android:layout_height="fill_parent" 
    android:orientation="vertical" > 

    <TextView 
     android:id="@+id/textNomeGruppo" 
     android:layout_width="wrap_content" 
     android:layout_height="wrap_content" 
     android:layout_alignParentLeft="true" 
     android:layout_alignParentTop="true" 
     android:text="Large Text" 
     android:textColor="#FF0000" 
     android:padding="14dp" 
     android:textAppearance="?android:attr/textAppearanceLarge" /> 

    <TextView 
     android:id="@+id/textNoteGruppo" 
     android:layout_width="wrap_content" 
     android:layout_height="wrap_content" 
     android:layout_below="@+id/textNomeGruppo" 
     android:paddingLeft="14dp" 
     android:paddingRight="14dp" 
     android:paddingBottom="7dp" 
     android:text="Small Text" 
     android:textAppearance="?android:attr/textAppearanceSmall" /> 

    <ImageView 
     android:id="@+id/imgGruppo" 
     android:layout_width="50dp" 
     android:layout_height="50dp" 
     android:layout_alignParentRight="true" 
     android:src="@drawable/icon" 
     /> 

</RelativeLayout> 

He añadido "android: src ..." sólo para comprobar si el imageview es visible, y lo es. ¡El único problema es que no puedo cambiarlo! He intentado setImageBitmap, usando solo el mapa de bits que creé, probé setimagedrawable creando un mapa de bits, pero sin efectos. sin errores, sin nada. Por favor, ¿dónde está el error? gracias

+1

¿Ayudaría a llamar iv.invalidate() después de iv.setImageDrawable (estirable)? –

+0

si agrego invalidar() al código, nada cambia –

+2

también, gracias al tipo que votó negativamente sin decir nada constructivo. salud Amigo. –

Respuesta

5

Supongo que no está haciendo esto en el hilo derecho. Puedes probar esto llamando a este código, luego girando la pantalla (o abriendo el teclado físico, si tienes uno de esos teléfonos). Esto hará que la interfaz de usuario se actualice.

De todos modos, ¿en qué contexto llamas a esto? Hilo de fondo? Desea actualizar la interfaz de usuario en el hilo de la interfaz de usuario, o tendrá que llamar a algo como 'invalidar' en la vista para forzarlo a volver a dibujar.

+0

esto es una pieza del hilo "principal" de UI. Precisamente, está en el objeto Handler definido como un miembro interno de la clase de actividad. Los bytes de imágenes sin formato se obtienen a través de una asynctask y se pasan al subproceso de la interfaz de usuario mediante un método de devolución de llamada que implementé (que funciona porque se usa con éxito en otra parte de la aplicación) –

+0

De todos modos, traté de rotar la pantalla pero las imágenes no se actualizaron ya sea. La imagen predeterminada aún se muestra. –

12

Es un problema de falta de memoria, puede solucionarlo utilizando este método como el siguiente, La opción "inSampleSize" devolverá una imagen más pequeña y guardará la memoria. Usted puede simplemente llamar esto en ImageView.setImageBitmap

private Bitmap loadImage(String imgPath) { 
    BitmapFactory.Options options; 
    try { 
     options = new BitmapFactory.Options(); 
     options.inSampleSize = 4;// 1/4 of origin image size from width and height 
     Bitmap bitmap = BitmapFactory.decodeFile(imgPath, options); 
     return bitmap; 
    } catch (Exception e) { 
     e.printStackTrace(); 
    } 
    return null; 
} 
+0

No he manejado este proyecto desde hace un tiempo, así que no puedo probar su sugerencia. Voy a votar por el esfuerzo, de todos modos, y espero que esto pueda ayudar a alguien en el futuro. Gracias. –

+0

@STTLCU gracias por su apoyo. @. @ –

1

La siguiente solución funcionó para mí. Usé la biblioteca de Picasa.

private Uri getImageUri(Bitmap inImage) { 
    ByteArrayOutputStream bytes = new ByteArrayOutputStream(); 
    inImage.compress(Bitmap.CompressFormat.JPEG, 100, bytes); 
    String path = MediaStore.Images.Media.insertImage(activity.getContentResolver(), inImage, "Title", null); 
    return Uri.parse(path); 
} 

public void bitmapIntoImageView(ImageView imageView, Bitmap bitmap, Activity activity){ 
    Uri imageUri = getImageUri(bitmap); 
    Picasso.with(activity).load(imageUri).into(imageView); 
} 

public void imagePathIntoImageView(ImageView imageView, String imagePath, Activity activity) { 
    Uri imageUri = Uri.fromFile(new File(imagePath)); 
    Picasso.with(activity).load(imageUri).into(imageView); 
} 

Picasa: http://square.github.io/picasso/

Llame a la función para configurar el mapa de bits en ImageView

bitmapIntoImageView(imageView, bitmap, MainActivity.this) 
+0

picasso funciona bien –

Cuestiones relacionadas