gpt4 book ai didi

java - Android kotlin 扩展错误

转载 作者:行者123 更新时间:2023-11-30 00:07:54 26 4
gpt4 key购买 nike

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

在模拟器 PRE Lolipop (<21 api) 上运行应用时出现该错误

引起问题的函数:

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 已启用。

最佳答案

解决方案

基于 this issuethis fix:

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 默认值删除 API 26 中添加的这些方法并使用替代动画:

Animator.AnimatorListener:

onAnimationEnd added in API level 26

void onAnimationEnd (Animator animation, boolean isReverse)

onAnimationStart added in API level 26

void onAnimationStart (Animator animation, boolean isReverse)

虽然不是必需的,但可以覆盖这些方法以在动画开始时获取额外的播放方向信息。

AnimatorSet :

Starting in Android 8.0 (API 26) the AnimatorSet API supports seeking and playing in reverse.


注意:

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

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

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

或替换

super.onAnimationEnd(animation, isReverse)

通过

onAnimationEnd(animation)

避免错误:

Super calls to Java default methods are prohibited in JVM target 1.6. Recompile with '-jvm-target 1.8'

并将下一行添加到我的 gradle.properties 文件 thanks to this answer

android.enableD8=true

避免异常:

com.android.dx.cf.code.SimException: default or static interface method used without --min-sdk-version >= 24

现在编译,刚刚启动 kitKat 模拟器...

它有效,而且我的项目中还启用了 MultiDex。

抱歉,我无法重现。

或者,使用 Java 8 默认值删除这两个方法,它也有效。


注2:

Arpan 关于 AnimatorListenerAdapter 的建议可行,但不是必需的。

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

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

然后像这样使用委托(delegate):

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

override fun onAnimationEnd(animation: Animator) {
// Do something
}
})

注3:

复制将其添加到扩展功能:

E/AndroidRuntime: FATAL EXCEPTION: main Process: ...android, PID: 3409 java.lang.VerifyError: com/.../ui/common/extension/android/view/ViewExtensionKt$animateFadeOut$1

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

  • 替换调用 onAnimationEnd 的 super 调用也可以解决它:

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

enter image description here

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

enter image description here

关于java - Android kotlin 扩展错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48652946/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com