Нужно предложение по смешанным изображениям "Uri / int id" - PullRequest
4 голосов
/ 21 февраля 2010

У меня следующая проблема:

предположим, что до сих пор я использую R.drawable.img для установки изображения в некоторых изображениях с

imgView.setImage(aProduct.getImgId());

упрощенный класс продукта выглядит следующим образом:

class Product{
        int imgId;

        ....
        public void setImgId(int id){
        this.imgId=id;
        }

        public int getImgId(){
        return this.imgId
        }

        ...




    }

мое приложение теперь "развито", потому что пользователь может добавлять индивидуальные продукты беря img из камеры и получая Uri картинки. и установить изображение в ImageView imgView.setImgURI (Uri)

Теперь мой вопрос: Каков наилучший подход для создания смешанных окружающих ресурсов изображений int / Uri? я могу получить Uri "R.drawable.img"?

Я не уверен, что мой вопрос ясен, я имею в виду:

Я должен проверить, прежде чем устанавливать представление изображения, имеет ли мой продукт Uri или int Id, а затем сделать «если» для вызова соответствующего метода, или есть более простое решение?

Спасибо, что читаете, и извините за мой английский.

Привет.

1 Ответ

1 голос
/ 06 октября 2010

Ваша проблема в том, что в основном есть 3 типа ресурсов изображения:

  • R.id... ресурсы : внутренние ресурсы, такие как значки, которые вы помещаете в папку res
  • URI контента : локальные файлы или ресурсы провайдера контента, такие как content:// или file:///sdcard/...
  • URL удаленного файла : изображения в Интернете, такие как http://...

Вы ищете способ обойти один идентификатор , который может иметь дело со всеми тремя . Моим решением было передать строку : либо toString () URI, либо просто представление строки целого числа R.id.

Я использую следующий код, например, чтобы справиться с этим и заставить код работать с ним:

public static FastBitmapDrawable returnAndCacheCover(String cover, ImageRepresentedProductArtworkCreator artworkCreator) {
    Bitmap bitmap = null;
    Uri coverUri = null;
    boolean mightBeUri = false;
    //Might be a resId. Needs to be cached. //TODO: problem: resId of default cover may not survive across versions of the app.
    try {
        bitmap = BitmapFactory.decodeResource(Collectionista.getInstance().getResources(), Integer.parseInt(cover));
    } catch (NumberFormatException e) {
        //Not a resId after all.
        mightBeUri=true;
    }
    if(bitmap==null || mightBeUri){
        //Is not a resId. Might be a contentUri.
        try {
            coverUri = Uri.parse(cover);
        } catch (NullPointerException ne) {
            //Is null
            return null;
        }
    }
    if(coverUri!=null){
        if(coverUri.getScheme().equals("content")){
            //A contentUri. Needs to be cached.
            try {
                bitmap = MediaStore.Images.Media.getBitmap(Collectionista.getInstance().getContentResolver(), coverUri);
            } catch (FileNotFoundException e) {
                return null;
            } catch (IOException e) {
                return null;
            }
        }else{
            //Might be a web uri. Needs to be cached.
            bitmap = loadCoverFromWeb(cover);

        }
    }
    return new FastBitmapDrawable(bitmap);
}

Возможно, вам будет интересно взять на себя логическую часть. Ofcourse cover это строка, о которой идет речь.

Забудьте android.resource:// как замену целого числа R.id.... Претензии ходят вокруг не работает: http://groups.google.com/group/android-developers/browse_thread/thread/a672d71dd7df4b2d

Чтобы узнать, как реализовать loadCoverFromWeb, посмотрите в других вопросах или пингуйте меня. Этот веб-материал - своего рода поле.

(На основе кода GPLv3 из моего приложения Collectionista: https://code.launchpad.net/~pjv/collectionista/trunk)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...