2011-11-07 14 views
10

私は、ネットから取り出したイメージを含むバイト配列を持っています。私は怠惰に私のUIアクティビティ(または私は少なくともBitmapfactory、BitmapDrawableとsetImageDrawableを使用してしようとしている)にそれらを読み込んでいます。ここに私のコードは次のとおりです。ここsetImageBitmapは目に見える効果がありません

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 

はXMLが

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

を関与している私が、「アンドロイド:SRC ...」追加したImageViewのが見えて、それがある場合にだけチェックします。唯一の問題は私がそれを変更することができないということです! 私が作成したビットマップのみを使用してsetImageBitmapを試しました。setimageDrawableを使用してBitmapDrawableを作成しようとしましたが、効果はまったくありませんでした。エラーも何もない。 どうか、間違いはありますか?ありがとうございます

+1

をビットマップを設定するには、以下の関数を呼び出しますか? –

+0

コードにinvalidate()を追加すると、何も変更されません –

+2

、建設的なことは何も言わずに下降した男のおかげです。歓声、男。 –

答えて

5

私は右のスレッドでこれをやっていないと思います。このコードを呼び出し、画面を回転させて(またはそれらの電話の1つがある場合は物理的なキーボードを開くことで)これをテストすることができます。これにより、UIが更新されます。

とにかく、これをどのようなコンテキストと呼んでいますか?バックグラウンドスレッド? UIスレッドでUIを更新したい場合や、再描画を強制するためにViewで 'invalidate'のようなものを呼び出す必要があります。

+0

これはUI「メイン」スレッドの一部です。正確には、アクティビティクラスの内部メンバとして定義されたHandlerオブジェクトです。生のイメージバイトはasynctask経由で取得され、私が実装したコールバックメソッドを介してUIスレッドに渡されます(これはアプリケーションのどこかで正常に使用されているために機能します) –

+0

とにかく画面を回転しようとしましたが、どちらか。デフォルト画像は引き続き表示されます。 –

12

メモリ不足のため、この方法で修正することができます。 "inSampleSize"オプションを使用すると、画像が小さくなり、メモリが節約されます。 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

私はしばらくこのプロジェクトを管理していないので、あなたの提案をテストすることができません。とにかく、私は努力のためにアップヴォートするつもりです、そして、これが将来誰かを助けることができることを願っています。ありがとうございました。 –

+0

@STTLCUサポートに感謝します。 @。@ –

1

以下の解決策が私に役立ちました。私は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/

それはiv.setImageDrawable(描画可能)の後に)(iv.invalidateを呼び出すために役立つだろうImageViewの

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

ピカソはうまくいく –

関連する問題