ImageView不刷新/反映更改

我正在使用照片select器来select图像并将其写入应用程序专用文件。 我的大部分重要源代码如下所示。 一旦我按下button并执行第一个图像select意图,则成功更新图像视图。 但是,一旦我再次按下图像selectbutton(在同一活动中),则图像视图不会更新,除非我退出并重新启动活动。 所以我知道图像被保存成功,但为什么布局中的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会改变以反映这一点。 但是,如果我试图再次select图像(相同的活动),ImageView将不会更新,直到我退出并重新进入活动。 我不知道为什么会发生这种情况,是因为我每次都试图写入temp.jpg? 或者我需要刷新我的布局以反映在ImageView中的变化?

Solutions Collecting From Web of "ImageView不刷新/反映更改"

根据ImageView源代码判断,如果使用相同的URI调用setImageURI,则ImageView将不会重新加载图像。 您可以尝试通过将图像写入另一个文件来更改URI。

如果“新”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))); } } 

invalidate()不起作用。 尝试破解:

  imageView.setImageURI(null); imageView.setImageURI(newUri); 

强制重绘你的widget / View只需调用View.invalidate();

我有一个类似的问题,我使用设备相机拍照,然后想要在原始屏幕中的imageView刷新,当我回到它。 解决方法是调用onResume()中的View.invalidate()。