Программная настройка ресурса ImageView не работает - PullRequest
4 голосов
/ 30 июня 2019

Я пытаюсь реализовать функцию, при которой пользователь может выбрать файл изображения из хранилища, и это изображение отображается в уменьшенном изображении ImageView.

Компонент выбора файла выглядит правильно:

Intent intent = new Intent(Intent.ACTION_GET_CONTENT);
intent.setType("image/*");
startActivityForResult(intent, GET_ATTACHMENT_RESULT); 

//...

@Override
protected void onActivityResult(int requestCode, int resultCode, @Nullable Intent data) {
    super.onActivityResult(requestCode, resultCode, data);

    if (requestCode == GET_ATTACHMENT_RESULT){
        if (resultCode == RESULT_CANCELED){
            // Anything TODO here?
        } else if (resultCode == RESULT_OK){
            Uri uri = data.getData();

            addTimeFragment.onImageUrlReceived(uri);
        }
    }
}

Возвращаемый Uri выглядит как Uri содержимого и имеет некоторый путь, например:

content://com.android.providers.media.documents/document/image%3A14702

Вызов Uri.getPath () возвращает:

/document/image:14702

Я пробовал множество различных решений, найденных в многочисленных сообщениях переполнения стека, включая Picasso (идеальное решение), создание растровых изображений из различных методов, настройку URI ImageView и т. д ...

Нет программного метода настройки ресурса ImageView, работает даже на PNG, расположенных в моих чертежах. Я могу только успешно установить android:src в XML.

Проверка работоспособности:

  • ImageView видим, правильно ограничен и имеет соответствующую высоту и ширину.
  • Я могу установить исходное изображение в XML, и оно появляется.Я также установил цвет фона, чтобы он был на экране.Все хорошо в XML.
  • Я также могу успешно программно установить цвет фона ImageView, поэтому я знаю, что ссылаюсь на правильный ImageView в коде.

XML:

<ImageView
    android:id="@+id/thumbnail"
    android:layout_width="48dp"
    android:layout_height="48dp"
    app:layout_constraintTop_toBottomOf="@id/time_entry_spacer"
    app:layout_constraintStart_toStartOf="@id/camera_bg"
    android:layout_marginBottom="4dp"
    android:layout_marginStart="6dp"
    android:background="#220000FF"/> 

НазначениеImageView:

//attachThumbnail is my ImageView
attachThumbnail = getActivity().findViewById(R.id.thumbnail);
attachThumbnail.setBackgroundColor(context.getResources().getColor(R.color.colorAccent));  // This works as a sanity check

Различные сбои с методом onImageUrlReceived:

public void onImageUrlReceived(Uri uri){
        Log.d(APP_TAG, "URI: " + uri.toString());
        Log.d(APP_TAG, "URI: " + uri.getPath());

// Even loading a known drawable fails
// Picasso.with(context).load(R.drawable.calendar).fit().error(R.drawable.error).into(attachThumbnail);


// Picasso.with(context).load(uri).fit().error(R.drawable.error).into(attachThumbnail);


// Picasso.with(context).load(uri.getPath()).fit().error(R.drawable.error).into(attachThumbnail);


//        File imgFile = new  File(url);
//        if(imgFile.exists()){
//            Bitmap myBitmap = BitmapFactory.decodeFile(imgFile.getAbsolutePath());
//
//            attachThumbnail.setImageBitmap(myBitmap);
//        }


//        attachThumbnail.setImageURI(uri);


//        Bitmap bitmap = null;
//        try {
//            bitmap = MediaStore.Images.Media.getBitmap(getActivity().getContentResolver(), uri);
//        } catch (IOException e) {
//            e.printStackTrace();
//        }
//        attachThumbnail.setImageBitmap(bitmap);


//        Bitmap b = BitmapFactory.decodeFile(uri.getPath());
//        attachThumbnail.setImageBitmap(b);


// See DownloadImage AsyncTask below
//        new DownloadImage(attachThumbnail).execute(uri.getPath());


// InputStream with scaling
//        try {
//            InputStream ims = getActivity().getContentResolver().openInputStream(uri);
//            Bitmap b = BitmapFactory.decodeStream(ims);
//            Bitmap b2 = Bitmap.createScaledBitmap(b, 50, 50, false);
//            attachThumbnail.setImageBitmap(b2);
//        } catch (FileNotFoundException e) {
//            e.printStackTrace();
//        }


// InputStream without Scaling
//        Bitmap bitmap = null;
//        try {
//            bitmap = BitmapFactory.decodeStream(getActivity().getContentResolver().openInputStream(uri));
//        } catch (FileNotFoundException e) {
//            e.printStackTrace();
//        }
//        attachThumbnail.setImageBitmap(bitmap);
    }

    public class DownloadImage extends AsyncTask<String, Void, Bitmap> {
        ImageView bmImage;

        public DownloadImage(ImageView bmImage) {
            this.bmImage = bmImage;
        }

        protected Bitmap doInBackground(String... urls) {
            String urldisplay = urls[0];
            Bitmap mIcon11 = null;
            try {
                InputStream in = new java.net.URL(urldisplay).openStream();
                mIcon11 = BitmapFactory.decodeStream(in);
            } catch (Exception e) {
                Log.d("Error", e.getStackTrace().toString());

            }
            return mIcon11;
        }

        protected void onPostExecute(Bitmap result) {
            bmImage.setImageBitmap(result);
        }
    }

Любые другие мысли или идеи здесь очень приветствуются.Я определенно бью свою голову об стену на этом.

Спасибо.

1 Ответ

0 голосов
/ 30 июня 2019

Я разобрался в проблеме.

Поскольку мой ImageView находился во Фрагменте, а не непосредственно в Деятельности, я звонил onImageUrlReceived(Uri uri) до того, как onResume() был вызван для моего Фрагмента. onActivityResult вызывается до возобновления фрагмента. В результате ImageView был настроен правильно, но затем, через долю секунды, я переназначил ImageView, когда вызывался onResume, чтобы он выглядел так, как будто ничего не было сделано.

В результате я теперь храню Uri как элемент Fragment и в onResume():

attachThumbnail = getActivity().findViewById(R.id.thumbnail);

if (userAttachmentUri != null){
    Picasso.with(getContext()).load(userAttachmentUri).fit().into(attachThumbnail);
}```
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...