【问题标题】:Failed to retrieve removeGhost method获取 removeGhost 方法失败
【发布时间】:2023-04-07 22:58:01
【问题描述】:

我正在我的应用中安装 Android 导航组件。
一些转换工作正常,但对于这个我有一个错误。来自片段 A 的转换视图停留在新片段 (B) 上并隐藏了一些元素。此外,当我在片段中滚动时,视图不会随之滚动。这是我得到的错误:

W/t.qoqa.ui.debu: Accessing hidden method Landroid/view/GhostView;->removeGhost(Landroid/view/View;)V (greylist-max-p, reflection, denied)
I/GhostViewApi21: Failed to retrieve removeGhost method
    java.lang.NoSuchMethodException: android.view.GhostView.removeGhost [class android.view.View]

我从片段 A 中的 RecyclerView 开始,单击时我设置了一个唯一的过渡名称。
然后,我使用 SafeArgs 和 FragmentNavigatorExtras 中的视图将此名称作为参数传递。

在片段 B 中,我延迟了 onCreate 中的转换:postponeEnterTransition() 并设置过渡类型:

transition = TransitionSet().apply {
    addTransition(ChangeTransform())
    addTransition(ChangeBounds())
    startDelay = 150
}
sharedElementEnterTransition = transition
sharedElementReturnTransition = transition

我在 onViewCreated 中设置了名称:ViewCompat.setTransitionName(product_image, args.imageTransitionName)

最后,当图像准备好显示时,Glide Listener 会启动过渡:

listener = object: RequestListener<Drawable> {
    override fun onLoadFailed(
        e: GlideException?,
        model: Any?,
        target: Target<Drawable>?,
        isFirstResource: Boolean
    ): Boolean {
        startPostponedEnterTransition()
        return false
    }

    override fun onResourceReady(
        resource: Drawable?,
        model: Any?,
        target: Target<Drawable>?,
        dataSource: DataSource?,
        isFirstResource: Boolean
    ): Boolean {
        startPostponedEnterTransition()
        return false
    }
}

而且返回转换也不起作用。
我只使用androidx.transition.* 元素

提前感谢您的帮助

【问题讨论】:

    标签: android androidx android-transitions android-architecture-navigation shared-element-transition


    【解决方案1】:

    我在 Google 的 Transitions 库中工作。 此问题意味着您已将 Android 10(Q) 设置为 targetSdkVersion 并使用过时版本的转换库。旧版本使用反射来访问 Android 框架中的私有方法,现在从 Q 开始受到限制(当您将其指定为 targetSdk,而不是 compileAdk 时)。较新的版本不再使用反射。 要解决此问题,您需要将转换库版本更新到至少 1.2.0 https://developer.android.com/jetpack/androidx/releases/transition#1.2.0

    【讨论】:

    • @Andrey 在 version1.2.0 中,我也遇到了同样的错误。它尝试使用反射来查找 removeGhost 方法,但失败了
    • @Dharmendra 我很确定它不应该发生,因为 1.2.0 中没有任何反射。您确定该版本实际上已更新吗?如果它会继续为您崩溃,请您在issuetracker.google.com/issues/new?component=460400 提交一个错误。谢谢
    猜你喜欢
    • 2011-05-25
    • 1970-01-01
    • 2015-05-17
    • 2015-12-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-07-23
    • 2011-06-24
    相关资源
    最近更新 更多