2011-11-07 20 views
10

Ho un array di byte che contiene un'immagine recuperata dalla rete. Li sto caricando pigramente sulla mia attività di interfaccia utente (o sto provando almeno a: D) usando Bitmapfactory, BitmapDrawable e setImageDrawable. qui è il mio codice:setImageBitmap non ha effetto visibile

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 

qui è la XML coinvolto

<?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> 

ho aggiunto "android: src ..." solo per controllare se l'ImageView è visibile, e lo è. L'unico problema è che non posso cambiarlo! Ho provato setImageBitmap, usando solo la bitmap che ho creato, ho provato setimageDrawable creando un BitmapDrawable, ma senza effetti. nessun errore, niente di niente. Per favore, dov'è l'errore? grazie

+1

Sarebbe utile per chiamare iv.invalidate() dopo iv.setImageDrawable (drawable)? –

+0

se aggiungo invalidate() al codice, nulla cambia anche –

+2

, grazie al ragazzo che ha downvoted senza dire nulla di costruttivo. evviva, amico. –

risposta

5

La mia ipotesi è che non lo stai facendo nel thread giusto. Potresti provare questo chiamando questo codice, quindi ruotando lo schermo (o aprendo la tastiera fisica, se hai uno di quei telefoni). Ciò causerà l'aggiornamento dell'interfaccia utente.

In ogni caso, in che contesto stai chiamando? Thread di sfondo? Dovresti aggiornare l'interfaccia utente nel thread dell'interfaccia utente, altrimenti dovrai chiamare qualcosa come "invalidate" nella vista per ottenere un re-draw forzato.

+0

questo è un pezzo del thread "principale" dell'interfaccia utente. Precisamente, è nell'oggetto Handler definito come membro interno della classe di attività. I byte immagine grezza vengono recuperati tramite un asynctask e passati al thread dell'interfaccia utente tramite un metodo di callback implementato (che funziona perché viene utilizzato con successo altrove nell'app) –

+0

In ogni caso, ho provato a ruotare lo schermo ma le immagini non sono state aggiornate o. L'immagine predefinita è ancora mostrata. –

12

È un problema di memoria insufficiente, è possibile risolvere il problema utilizzando questo metodo come riportato di seguito, L'opzione "inSampleSize" restituirà un'immagine più piccola e risparmia memoria. Puoi semplicemente chiamarlo in 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

Non ho gestito questo progetto da un po ', quindi non sono in grado di testare il tuo suggerimento. Sto andando avanti con lo sforzo, comunque, e spero che questo possa aiutare qualcuno in futuro. Grazie. –

+0

@STTLCU grazie per il supporto. @. @ –

1

La soluzione di seguito ha funzionato per me. Ho usato la libreria 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/

Chiamare la funzione per impostare la bitmap in ImageView

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

picasso funziona bene –

Problemi correlati