ImageView不刷新/反映更改

ImageView不刷新/反映更改

问题描述:

我正在使用照片选择器来选择图像并将其写入应用程序专用文件。我的大部分重要源代码如下所示。一旦我按下一个按钮并执行第一个图像选择意向,则它会成功更新图像视图。但是,一旦我再次按下图像选择按钮(在同一活动中),则图像视图不会更新,除非我退出并重新启动活动。所以我知道该图像已成功保存,但为什么布局中的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中的更改?

+0

是否有一些代码丢失?从你写的内容来看,不需要打开输出流到选定的图像。 – 2010-12-16 08:26:53

+0

我已经添加了大部分的源代码。我还发现,如果我只是将意图的值作为位图返回,则图像视图会成功更新。但是,我仍然想知道问题的根源。 – damonkashu 2010-12-16 10:21:29

+0

那么有什么我不知道的ImageViews或图像选择器的意图?在重新开始活动之前不反映变化的东西? – damonkashu 2010-12-17 08:43:09

要强制重绘窗口小部件/查看就叫View.invalidate();

+3

我在ImageView上调用它,它似乎没有做任何事情 – damonkashu 2010-12-17 07:03:03

+1

我在这里有同样的问题。无效不刷新我的自定义imageview – 2011-11-22 20:06:23

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

+4

谢谢!我花了太多时间试图弄清楚这一点。在自己查看源代码并尝试view.requestLayout()和view.invalidate()哪些不起作用后,我已经得出结论,在将uri设置为null之前将其设置为null是最好的,如果不是使用setImageUri的唯一方法为单个更改的图像文件。 – 2012-11-23 22:13:30

+3

谢谢你为此。它只是节省了我几个小时的关于ImageView刷新的困惑。 在我的情况下,我希望在语言环境更新上进行图像刷新,但显然,由于resId不会更改,因此ImageView仅会忽略您的请求,而不检查资源本身是否已更改。只是做了一个setImageDrawable(空),后面是常规setImageResource(R.drawable.image),它的工作原理。 一定是性能目的的实现选择。 – Toryu 2013-03-17 14:03:31

+0

谢谢@ Pilot_51和Toryu ...将imageDrawable设置为null,然后设置ImageURi,对我也有效。 – Akshat 2014-06-25 17:00:16

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

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