2010-12-16 4 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; 
    } 
    } 

по результатам деятельности, я установил URI образа ImageView в этот файл.

Когда он впервые завершен, изменения 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 просто позвоните View.invalidate();

18

Судя по исходным ImageView коде ImageView не будет перезагружать изображение, если вы звоните setImageURI с тем же URI. Вы можете попробовать изменить URI, записав свое изображение в другой файл.

1

У меня была аналогичная проблема, когда я использовал камеру устройств для съемки, а затем хочу, чтобы изображениеView на исходном экране обновилось, когда я вернулся к нему. Решением было вызвать View.invalidate() в onResume().

11

ImageView не будет перерисовываться, если «новый» URI такой же, как старый. «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);