#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 кажется слишком накладной вместо универсального решения.