2010-12-16 30 views
17

画像を選択してアプリケーション専用ファイルに書き込むことを意図した写真ピッカーを使用しています。私の重要なソースコードのほとんどが以下に示されています。ボタンを押して最初のイメージ選択のインテントを実行すると、イメージビューが正常に更新されます。ただし、同じアクティビティで画像選択ボタンをもう一度押すと、アクティビティを終了して再起動しない限り、画像ビューは更新されません。だから私はイメージが正常に保存されていることを知っているが、なぜレイアウト内のImageViewはリフレッシュまたは更新されませんか?ImageViewで変更が反映されない/反映されない

public void onResume() { 
    super.onResume(); 
    ImageView myImageView = (ImageView)findViewById(R.id.contact_image); 
    if (hasImage) { 
     myImageView.setImageURI(Uri.fromFile(getFileStreamPath(TEMP_PHOTO_FILE))); 
    } 
    } 

    @Override 
    public void onActivityResult(int requestCode, int resultCode, Intent data) { 
    switch (requestCode) { 
    case PHOTO_PICKED: 
     if (resultCode == RESULT_OK) { 
     if (data != null) { 
      Bundle extras = data.getExtras(); 
      if (extras != null) { 
      hasImage = true; 
      bmp = (Bitmap) extras.get("data"); 
      } 
     } 
     } 
     break; 
    } 
    } 

    private OnClickListener mChooseImage = new OnClickListener() { 
    @Override 
    public void onClick(View v) { 
     try { 
     // Launch picker to choose photo for selected contact 
     Intent intent = new Intent(Intent.ACTION_GET_CONTENT, null); 
     intent.setType("image/*"); 
     intent.putExtra("crop", "true"); 
     intent.putExtra("aspectX", 1); 
     intent.putExtra("aspectY", 1); 
     intent.putExtra("outputX", ICON_SIZE); 
     intent.putExtra("outputY", ICON_SIZE); 
     intent.putExtra("scale", true); 
     intent.putExtra("return-data", false); 
     intent.putExtra(MediaStore.EXTRA_OUTPUT, Uri.fromFile(getTempFile())); 
     intent.putExtra("outputFormat", Bitmap.CompressFormat.JPEG.toString()); 
     startActivityForResult(intent, PHOTO_PICKED); 
     } catch (ActivityNotFoundException e) { 
     // LOG THIS 
     } 
    } 
    }; 

private File getTempFile() { 
    try { 
     if (!hasImage) { 
     FileOutputStream fos = openFileOutput(TEMP_PHOTO_FILE, MODE_WORLD_WRITEABLE); 
     fos.close(); 
     } 
     return getFileStreamPath(TEMP_PHOTO_FILE); 
    } catch (FileNotFoundException e) { 
     // To be logged later 
     return null; 
    } catch (IOException e) { 
     // To be logged later 
     return null; 
    } 
    } 

私はImageViewのイメージURIをこのファイルに設定しました。

初めて完了すると、これを反映するようにImageViewが変更されます。ただし、イメージを再度選択しようとすると(同じアクティビティ)、アクティビティを終了して再入力するまでImageViewは更新されません。私はいつもtemp.jpgに書き込もうとしているのですか?または、ImageViewの変更を反映するためにレイアウトを更新する必要がありますか?あなたが同じURIでsetImageURIを呼び出す場合

+0

いくつかコードがありますか?あなたが書いたものから、出力ストリームを選択した画像に開く必要はありません。 –

+0

ソースコードの大部分を追加しました。また、インテントから値をビットマップとして返​​すだけで、イメージビューが正常に更新されることもわかります。しかし、私はまだ問題の原因を知りたい。 – damonkashu

+0

ImageViewsや画像ピッカーの意図についてわからないことがありますか?アクティビティを再開するまで変更を反映しないものはありますか? – damonkashu

答えて

1

ちょうどImageViewのソースコードから判断View.invalidate();

+3

ImageViewでこれを呼び出していますが、何もしていないようです – damonkashu

+1

私はここで同じ問題があります。無効化が私のカスタム画像ビューをリフレッシュしていません –

18

を呼び出すウィジェット/ビューを再描画強制するには、ImageViewの画像をリロードしません。イメージを別のファイルに書き込むことでURIを変更することができます。

+4

ありがとうございます!私はこれを理解しようと多くの時間を費やしました。自分自身でソースを見て、view.requestLayout()とview.invalidate()がうまくいかなかった場合、私は、uriを再び設定する前にuriを設定するとsetImageUriを使う唯一の方法ではないと判断しました単一の変化する画像ファイルの場合。 –

+3

ありがとうございます。それはちょうどImageViewリフレッシュに関して混乱の数時間私を救った。 私の場合、ロケールの更新で画像を更新したかったのですが、resIdが変更されないため、ImageViewはリクエスト自体を無視して、リソース自体が変更されているかどうかをチェックしていないようです。ちょうどsetImageDrawable(null)の後に通常のsetImageResource(R.drawable.image)が続き、それが動作します。 パフォーマンス目的で実装されている必要があります。 – Toryu

+0

@ Pilot_51とToryuありがとうございました... imageDrawableをnullに設定してからImageURiを設定してください。 – Akshat

1

私はデバイスカメラを使って写真を撮った後、元の画面のimageViewを元の画面に戻したいときに同様の問題が発生しました。解決策は、onResume()でView.invalidate()を呼び出すことでした。

11

"新しい" URIが古いものと同じ場合、ImageViewは再描画されません。 "View.invalidate()"は機能しません。更新を強制するには、次の操作を実行します。

public void onResume() { 
    super.onResume(); 
    ImageView myImageView = (ImageView)findViewById(R.id.contact_image); 
    if (hasImage) { 
    myImageView.setImageDrawable(null); // <--- added to force redraw of ImageView 
    myImageView.setImageURI(Uri.fromFile(getFileStreamPath(TEMP_PHOTO_FILE))); 
    } 
} 
3

invalidate()は機能しません。ハックを試してみてください:

imageView.setImageURI(null); 
    imageView.setImageURI(newUri); 
関連する問題