Android kotlin扩展错误

java.lang.VerifyError:… / utils / KotlinViewExtKt $ animateFadeOut $ 1

在仿真器上运行应用程序时出现错误PRE Lolipop(<21 api)

引起麻烦的function:

fun View.animateFadeOut(animDuration: Long = 250) { this.animate() .alpha(0F) .setDuration(animDuration) .setListener(object : Animator.AnimatorListener { override fun onAnimationRepeat(p0: Animator?) {} override fun onAnimationEnd(animation: Animator?, isReverse: Boolean) { super.onAnimationEnd(animation, isReverse) show(false) } override fun onAnimationEnd(p0: Animator?) { show(false) } override fun onAnimationCancel(p0: Animator?) { } override fun onAnimationStart(animation: Animator?, isReverse: Boolean) { } override fun onAnimationStart(p0: Animator?) { } }) .start() } fun View.show(show: Boolean) { val vis = if (show) View.VISIBLE else View.GONE if (visibility != vis) { visibility = vis } } 

指向.setListener行。

在21 + api上完美运行。

AS版本:3.0.1。 Kotlin版本:1.2.21(试用1.1.51)。

可能是什么原因? 我的坏或kotlin? Multidex已启用。

基于这个问题和这个修复:

ViewExtension.kt

 fun View.animateFadeOut(animDuration: Long = 250L) { this.animate() .alpha(0F) .setDuration(animDuration) .setListener(object : AbstractAnimatorListener() { override fun onAnimationEnd(animation: Animator?, isReverse: Boolean) { super.onAnimationEnd(animation, isReverse) show(false) } override fun onAnimationEnd(p0: Animator?) { show(false) } }) .start() } fun View.show(show: Boolean) { val vis = if (show) View.VISIBLE else View.GONE if (visibility != vis) { visibility = vis } } 

AbstractAnimatorListener.kt

 abstract class AbstractAnimatorListener : Animator.AnimatorListener { override fun onAnimationRepeat(p0: Animator?) {} override fun onAnimationEnd(p0: Animator?) {} override fun onAnimationCancel(p0: Animator?) {} override fun onAnimationStart(p0: Animator?) {} override fun onAnimationEnd(animation: Animator?, isReverse: Boolean) { onAnimationEnd(animation) } override fun onAnimationStart(animation: Animator?, isReverse: Boolean) { onAnimationStart(animation) } } 

说明

尝试使用Java 8 Defaults删除在API 26中添加的这些方法,并使用替代animation:

Animator.AnimatorListener:

onAnimationEnd在API级别26中添加

 void onAnimationEnd (Animator animation, boolean isReverse) 

onAnimationStart添加到API级别26中

 void onAnimationStart (Animator animation, boolean isReverse) 

当animation开始时,这些方法可以被覆盖,但不是必需的,以获得额外的播放方向信息。

animation师集 :

从Android 8.0(API 26)开始,AnimatorSet API支持反向查找和播放。


注意:

 /** * Skipping calling super when overriding this method results in * {@link #onAnimationStart(Animator)} not getting called. */ default void onAnimationStart(Animator animation, boolean isReverse) { onAnimationStart(animation); } 

我需要添加到我的build.gradle文件来测试它

 tasks.withType(org.jetbrains.kotlin.gradle.tasks.KotlinCompile).all { kotlinOptions { jvmTarget = "1.8" } } 

或更换

 super.onAnimationEnd(animation, isReverse) 

通过

 onAnimationEnd(animation) 

避免错误:

在JVM目标1.6中禁止超级调用Java默认方法。 用’-jvm-target 1.8’重新编译

并将下一行添加到我的gradle.properties文件感谢这个答案

 android.enableD8=true 

避免例外:

com.android.dx.cf.code.SimException:使用默认或静态接口方法–min-sdk-version> = 24

它现在编译,刚刚启动一个kitKat模拟器…

它工作,MultiDex也在我的项目中启用。

对不起,我不能重现它。

或者,使用Java 8的默认方式删除这两个方法,它也可以。


笔记2:

关于AnimatorListenerAdapter的Arpan建议可以工作,但这不是必须的。

您可以删除这些方法,更改animation并创建:

 object EmptyAnimatorListener : Animator.AnimatorListener { override fun onAnimationRepeat(p0: Animator?) {} override fun onAnimationEnd(p0: Animator?) {} override fun onAnimationCancel(p0: Animator?) {} override fun onAnimationStart(p0: Animator?) {} } 

并使用这样的代表团:

  .setListener(object : Animator.AnimatorListener by EmptyAnimatorListener { override fun onAnimationStart(animation: Animator) { // Do something } override fun onAnimationEnd(animation: Animator) { // Do something } }) 

注3:

转载添加到扩展function:

E / AndroidRuntime:致命exception:主进程:… android,PID:3409 java.lang.VerifyError:com /…/ui / common / extension / android / view / ViewExtensionKt $ animateFadeOut $ 1

  • 使用Java Defaults移除Api 26方法解决了这个问题。

  • 替换调用onAnimationEnd的超级调用也解决了这个问题:

      override fun onAnimationEnd(animation: Animator?, isReverse: Boolean) { onAnimationEnd(animation) } 
  • 调用super.onAnimationStart(animation:Animator?,isReverse:Boolean)需要API 26:

在这里输入图像说明

  • 反编译Kotlin字节码显示这些方法无法解析:

在这里输入图像说明