Как запретить Kotlin кэшировать состояние ImageView во включенном макете XML несколькими фрагментами / действиями - PullRequest
0 голосов
/ 30 мая 2019

У меня есть макет XML с именем layout_image, например:

<?xml version="1.0" encoding="utf-8"?>
<android.support.constraint.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
android:layout_width="match_parent"
android:layout_height="wrap_content">

    <ImageView
        android:id="@+id/imageView"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:src="@drawable/grumpy_cat"
        app:layout_constraintEnd_toEndOf="parent"
        app:layout_constraintStart_toStartOf="parent"
        app:layout_constraintTop_toTopOf="parent" />

</android.support.constraint.ConstraintLayout>

Я включаю XML в несколько активностей / фрагментов

<include
    android:id="@+id/llytImage"
    layout="@layout/layout_image"
    android:layout_width="match_parent"
    android:layout_height="wrap_content" />

Я установил цветной фильтр на imageView в Actitivty A, обратившись к нему с помощью синтетического kotlinx:

import kotlinx.android.synthetic.main.layout_image.view.*

llytImage.imageView.setColorFilter(Color.RED)

Он становится красным, и я перехожу к занятию B. Мероприятие B также включает в себя тот же макет XML с тем же идентификатором. Тем не менее, imageView по-прежнему красный в действии B.

Кажется, что Котлин кеширует состояние imageView и использует то же представление, чтобы улучшить производительность.

Однако я не хочу, чтобы он кешировал imageView. Мне нужно состояние по умолчанию. Я попробовал 2 способа, чтобы Kotlin не смог его кешировать:

  1. Использование аннотации @ContainerOptions(CacheImplementation.NO_CACHE) в действиях, включающих XML
  2. Вызов imageView.clearFindViewByIdCache() при переходе к занятию B

Никто из них не работал для меня.

Если вы знаете истинное решение, я буду очень признателен. Спасибо

1 Ответ

0 голосов
/ 30 мая 2019

Управление рисованием, а не просмотром изображения, путем вызова mutate() сработало для меня:

import kotlinx.android.synthetic.main.layout_image.view.*

val drawable = llytImage.imageView.drawable.mutate()
val colorFilter = PorterDuffColorFilter(Color.RED, PorterDuff.Mode.SRC_IN)
drawable.colorFilter = colorFilter
...