Java.lang.RuntimeException:未知的动画名称:x。

4

自从我启用了Proguard之后,每当我在DrawerLayout上按下一个选项时,就会出现以下崩溃。导航是使用默认动画与导航组件一起完成的。我明白我必须在Proguard中加入规则,但是应该加入哪些规则更重要,为什么呢?

E/AnimationUtils: loadAnimation: resourceName = mypackagename:animator/nav_default_exit_anim E/AndroidRuntime: FATAL EXCEPTION: main Process: mypackagename, PID: 22537 java.lang.RuntimeException: Unknown animation name: x at android.view.animation.AnimationUtils.createAnimationFromXml(AnimationUtils.java:214) at android.view.animation.AnimationUtils.createAnimationFromXml(AnimationUtils.java:179) at android.view.animation.AnimationUtils.loadAnimation(AnimationUtils.java:143) at l.i.b.b.A(:2)


你的代码中使用了ObjectAnimator吗? - Mehran Mahmoudkhani
不,那个动画是导航动画默认值,来自andriox库。 - user1866731
5个回答

6

我在另一个问题中找到了答案。问题基本上是由于Proguard随机停止加载资源引起的。

对我来说,解决方法是:

-keepclassmembers class **.R$* {
       public static <fields>; 
}

1
我最近升级到fragment:fragment-ktx:1.3.2,每当我使用BottomNavigation导航时也会出现这个崩溃。
看起来这些动画是在Jetpack Navigation中引用的(NavigationUI.onNavDestinationSelected),并且被shrinkResources优化。
R.anim.nav_default_enter_anim
R.anim.nav_default_exit_anim
R.anim.nav_default_pop_enter_anim
R.anim.nav_default_pop_exit_anim
R.animator.nav_default_enter_anim
R.animator.nav_default_exit_anim
R.animator.nav_default_pop_enter_anim
R.animator.nav_default_pop_exit_anim

我尝试使用以下代码来保留它们:

<resources xmlns:tools="http://schemas.android.com/tools"
       tools:keep="@anim/nav_default*"/>

但是那并没有起作用。

因此,我选择在代码中引用它们。

成功的解决方法:

@Keep
fun _keep() = listOf(
    R.anim.nav_default_enter_anim,
    R.anim.nav_default_exit_anim,
    R.anim.nav_default_pop_enter_anim,
    R.anim.nav_default_pop_exit_anim,

    R.animator.nav_default_enter_anim,
    R.animator.nav_default_exit_anim,
    R.animator.nav_default_pop_enter_anim,
    R.animator.nav_default_pop_exit_anim,
)

我在一个样例项目中尝试复现,但由于无法确定具体原因,因此遇到了困难。


0

相关问题是资源缩小器 - 保留来自R类的已使用常量(除非整个R被保留)

我的解决方案是:

崩溃的原始代码:

fun NavOptions.Builder.withDefaultAnimation(): NavOptions.Builder {
    setEnterAnim(R.animator.nav_default_enter_anim)
    setExitAnim(R.animator.nav_default_exit_anim)
    setPopEnterAnim(R.animator.nav_default_pop_enter_anim)
    setPopExitAnim(R.animator.nav_default_pop_exit_anim)
    return this
}

我在项目中使用下面的代码后,它不再崩溃了。很奇怪。

navOptions {
    anim {
        enter = R.animator.nav_default_enter_anim
        exit = R.animator.nav_default_exit_anim
        popEnter = R.animator.nav_default_pop_enter_anim
        popExit = R.animator.nav_default_pop_exit_anim
    }
}

0

我遇到了同样的问题,解决方法是将所有@anim/替换为@animator/

my diff that saved the day


0

在发布版本中,我遇到了与BottomNavigationView相同的问题。 我认为对于DrawerLayout,密钥应该是相同的。

问题出现在这个方法中:

itemMenu.onNavDestinationSelected(navController)

在导航组件中混淆动画文件名称的问题

enter image description here

解决方案: 我只是覆盖了一些代码(有点硬编码),但它运行良好:

    bottom_nav.setOnNavigationItemSelectedListener {
        val navBuilder = NavOptions.Builder()
            .setLaunchSingleTop(true)
        if (itemMenu.order and Menu.CATEGORY_SECONDARY == 0) {
            navBuilder.setPopUpTo(
                findStartDestination(navController.graph)?.id ?: R.id.mainFragment, false
            )
        }
        val options = navBuilder.build()
        navController.navigate(
            if (itemMenu.itemId == R.id.subMainFragment) provideMainDestination() else itemMenu.itemId,
            null,
            options
        )
        true
    }

fun findStartDestination(graph: NavGraph): NavDestination? {
    var startDestination: NavDestination? = graph
    while (startDestination is NavGraph) {
        val parent = startDestination
        startDestination = parent.findNode(parent.startDestination)
    }
    return startDestination
}

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接