Подтвердить что ты не робот

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?

4b9b3361

Ответ 1

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

Ответ 2

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

Ответ 4

Чтобы перерисовать ваш виджет/Открыть только вызов View.invalidate();

Ответ 5

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