замените отображаемое на загруженное растровое изображение

#android

#Android

Вопрос:

Я пытаюсь заменить рисованные ресурсы загруженными растровыми изображениями.

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

 public class MainActivity extends AppCompatActivity {

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
    }

    @Override
    protected void attachBaseContext(Context newBase) {
        super.attachBaseContext(new InterceptingContextWrapper(newBase));
    }

    private class InterceptingContextWrapper extends ContextWrapper {

        private Resources resources;

        public InterceptingContextWrapper(Context base) {
            super(base);
            resources = new Resources(base.getAssets(), base.getResources().getDisplayMetrics(), base.getResources().getConfiguration()){
                @Override
                public Drawable getDrawable(int id, Theme theme) throws NotFoundException {
                    String resourceName = getResourceName(id);
                    if (id == R.drawable.sample) {
                        Log.i("InterceptionTest", "gotcha");
                    }
                    Log.i("InterceptionTest", "Getting drawable for resource "   resourceName);
                    return super.getDrawable(id, theme);
                }
            };
        }

        @Override
        public Resources getResources() {
            return resources;
        }
    }
}
  

Однако getDrawable метод запускается только для изображений, на которые ссылаются через app:srcCompat . Изображения, на которые ссылаются через android:src или android:background , не извлекаются через getDrawable ; однако отображаются некоторые изображения (в основном изображения, на которые ссылаются из пространства имен Android ( @android:drawable/... ). (но не все)

Если я создам подкласс Activity вместо AppCompatActivity этого, это тоже не поможет.

Есть идеи? Спасибо.

Комментарии:

1. Есть ли причина, по которой вы не используете imageView.setImageBitmap(BitmapFactory.decodeFile("/mnt/sdcard0/path/To/downloaded/ImageFile.jpg")); ?

2. Начиная с API 25, официально не поддерживается способ перехвата drawable inflation на уровне ресурсов. Вам нужно будет найти другой подход.

3. Для Android существует, казалось бы, бесконечное количество библиотек для загрузки изображений . Если ваши изображения поступают из нескольких мест, возможно, вам следует абстрагироваться от того, как эти изображения заполняются, используя существующую библиотеку, которая может обрабатывать несколько местоположений источника изображения.

4. @k3b: Такой подход приводит к декодированию изображения в основном потоке приложения, что приводит к сбою.

5. у меня есть кэш на основе активности. Таким образом, утечка не должна быть проблемой. и я хочу, чтобы макет, в котором используются определенные связанные изображения, настраивался с помощью пакетов загрузки. подготовка каждого возможного imageview кажется слишком накладной вместо универсального решения.