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

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

我使用的是第三方库,它有一些自定义视图实现。在实现中,它们调用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来解决此问题。

  1. override fun onCreateView(
  2. inflater: LayoutInflater,
  3. container: ViewGroup?,
  4. savedInstanceState: Bundle?
  5. ): View? {
  6. val baseInflater = LayoutInflater.from(requireActivity()) // NOT context
  7. // ...
  8. }

字符串

ttygqcqt

ttygqcqt2#

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

fivyi3re

fivyi3re3#

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

  1. val mContext = if (context is ViewComponentManager.FragmentContextWrapper)
  2. context.baseContext
  3. else
  4. context

字符串
this答案

vxqlmq5t

vxqlmq5t4#

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

  1. override fun onCreateView(
  2. inflater: LayoutInflater,
  3. container: ViewGroup?,
  4. savedInstanceState: Bundle?
  5. ): View {
  6. _binding = FragmentGoalsBinding.inflate(inflater, container, false)
  7. return binding.root
  8. }

字符串
我不得不做:

  1. override fun onCreateView(
  2. inflater: LayoutInflater,
  3. container: ViewGroup?,
  4. savedInstanceState: Bundle?
  5. ): View {
  6. val baseInflater = LayoutInflater.from(requireActivity())
  7. _binding = FragmentGoalsBinding.inflate(baseInflater, container, false)
  8. return binding.root
  9. }


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

展开查看全部

相关问题