如何防止 Kotlin 将 ImageView 的状态缓存在包含的 XML 布局中,由几个 fragments/activities
How to prevent Kotlin from caching the state of ImageView inside an included XML layout by several fragments/activities
我有一个名为 layout_image
的 XML 布局,如下所示:
<?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包含在几个activites/fragments
中
<include
android:id="@+id/llytImage"
layout="@layout/layout_image"
android:layout_width="match_parent"
android:layout_height="wrap_content" />
我通过使用 kotlinx synthetic 访问 Activty A 中的 imageView
设置了滤色器:
import kotlinx.android.synthetic.main.layout_image.view.*
llytImage.imageView.setColorFilter(Color.RED)
它变成红色,我导航到 Activity B。Activity B 也包含具有相同 ID 的相同 XML 布局。但是,imageView
在ActivityB中还是红色的。
Kotlin 似乎缓存了 imageView
的状态并使用相同的视图以提高性能。
但是,我不希望它缓存 imageView
。我需要默认状态。我尝试了两种方法来防止 Kotlin 缓存它:
- 在包含 XML
的活动中使用 @ContainerOptions(CacheImplementation.NO_CACHE)
注释
- 导航到 Activity B 时调用
imageView.clearFindViewByIdCache()
None 其中对我有用。
如果您知道真正的解决方案,我将不胜感激。
谢谢
通过调用 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
我有一个名为 layout_image
的 XML 布局,如下所示:
<?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包含在几个activites/fragments
中<include
android:id="@+id/llytImage"
layout="@layout/layout_image"
android:layout_width="match_parent"
android:layout_height="wrap_content" />
我通过使用 kotlinx synthetic 访问 Activty A 中的 imageView
设置了滤色器:
import kotlinx.android.synthetic.main.layout_image.view.*
llytImage.imageView.setColorFilter(Color.RED)
它变成红色,我导航到 Activity B。Activity B 也包含具有相同 ID 的相同 XML 布局。但是,imageView
在ActivityB中还是红色的。
Kotlin 似乎缓存了 imageView
的状态并使用相同的视图以提高性能。
但是,我不希望它缓存 imageView
。我需要默认状态。我尝试了两种方法来防止 Kotlin 缓存它:
- 在包含 XML 的活动中使用
- 导航到 Activity B 时调用
imageView.clearFindViewByIdCache()
@ContainerOptions(CacheImplementation.NO_CACHE)
注释
None 其中对我有用。
如果您知道真正的解决方案,我将不胜感激。 谢谢
通过调用 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