dagger.hilt.android.internal.managers. ViewValentManager $FragmentContextWrapper无法强制转换为android.app.Activity

yftpprvb  于 2023-11-15  发布在  Android
关注(0)|答案(4)|浏览(174)

我使用的是第三方库,它有一些自定义视图实现。在实现中,它们调用Utils.showSoftKeyboard(context as Activity)。这一点,沿着使用片段作为@AndroidEntryPoint,导致以下异常:
java.lang.ClassCastException: dagger.hilt.android.internal.managers.ViewComponentManager$FragmentContextWrapper cannot be cast to android.app.Activity的值。“
是否有任何方法可以在不更改第三方库的情况下修复此问题?

busg9geu

busg9geu1#

如果第三方库有一个问题跟踪器,最好提出这个问题。不能保证ViewcontextActivity:自定义视图或任何祖先中的android:theme属性也很容易导致同样的问题。
如果您没有在片段中填充任何@AndroidEntryPoint视图,则可以通过直接从Activity上下文获取LayoutInflater来解决此问题。

override fun onCreateView(
        inflater: LayoutInflater,
        container: ViewGroup?,
        savedInstanceState: Bundle?
    ): View? {
        val baseInflater = LayoutInflater.from(requireActivity()) // NOT context
        // ...
    }

字符串

ttygqcqt

ttygqcqt2#

如果没有Hilt权限,我们可以访问父活动,如下所示
(context as ContextWrapper).baseContext

fivyi3re

fivyi3re3#

对于你的问题来说可能已经晚了,但这里有一个解决方案,可能会帮助其他有同样问题的人。

val mContext = if (context is ViewComponentManager.FragmentContextWrapper)
            context.baseContext
        else
            context

字符串
this答案

vxqlmq5t

vxqlmq5t4#

基于Nitrodon的回答,我找到了解决方案。我使用了视图绑定的Hilt,我的代码看起来像:

override fun onCreateView(
    inflater: LayoutInflater,
    container: ViewGroup?,
    savedInstanceState: Bundle?
): View {
    _binding = FragmentGoalsBinding.inflate(inflater, container, false)
    return binding.root
}

字符串
我不得不做:

override fun onCreateView(
    inflater: LayoutInflater,
    container: ViewGroup?,
    savedInstanceState: Bundle?
): View {
    val baseInflater = LayoutInflater.from(requireActivity())
    _binding = FragmentGoalsBinding.inflate(baseInflater, container, false)
    return binding.root
}


我还使用viewModel Provider填充了我的viewModel,这是一个崩溃(没有init<>方法),然后我使用了by viewModels()

相关问题