2010-12-16 196 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中的更改?

+0

是否有一些代碼丟失?從你寫的內容來看,不需要打開輸出流到選定的圖像。 – 2010-12-16 08:26:53

+0

我已經添加了大部分的源代碼。我還發現,如果我只是將意圖的值作爲位圖返回,則圖像視圖會成功更新。但是,我仍然想知道問題的根源。 – damonkashu 2010-12-16 10:21:29

+0

那麼有什麼我不知道的ImageViews或圖像選擇器的意圖?在重新開始活動之前不反映變化的東西? – damonkashu 2010-12-17 08:43:09

回答

1

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

+3

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

+1

我在這裏有同樣的問題。無效不刷新我的自定義imageview – 2011-11-22 20:06:23

18

由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

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);