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字节码显示这些方法无法解析: