android Hilt ClassCastException:无法将ViewIntent Manager $FragmentContextWrapper强制转换为AppCompatActivity

bis0qfac  于 12个月前  发布在  Android
关注(0)|答案(3)|浏览(168)

我有这样一段代码,当我在适配器中单击viewHolder项时,

SpecialRequestNotFoundBottomSheetDialog {
            requestItem?.specialRequestEntity?.id?.let { id -> onCancelReasonsSelected(id, it) }
        }.show(itemView.context as AppCompatActivity).supportFragmentManager)

字符串
最近我迁移到Hilt,我得到了类强制转换异常,看起来像Hilt Package 上下文,我不能让父Activity获得所需的FragmentManager来显示对话框

2j4z5cfb

2j4z5cfb1#

我读了源代码找到这个解决方案FragmentComponentManager.findActivity(view.context) as Activity

lqfhib0f

lqfhib0f2#

我可能通过检查Context类型并获取BaseContext找到了解决此崩溃的方法。这是我现在使用的。我不知道是否有更好的方法来使用Hilt

private fun activityContext(): Context? {
    val context = itemView.context
    return if (context is ViewComponentManager.FragmentContextWrapper) {
        context.baseContext
    } else context
}

字符串

6xfqseft

6xfqseft3#

在我的例子中,我的自定义视图是在库模块中,即:(“com.android.library”),我在我的应用程序模块中使用hilt,即:(“com.android.application”)由于这个原因,我的应用程序崩溃了。因为我在我的应用程序模块中使用了Hilt库,上下文示例是由Hilt库创建的。我找不到fragmentManger。
因此,作为一种变通方法,我必须在我的库模块中添加Hilt,然后使用以下代码查找FragmentManger

private FragmentManager getFragmentManager(@NonNull Context mContext) {
        if (mContext instanceof AppCompatActivity) {
            return ((AppCompatActivity) mContext).getSupportFragmentManager();
        } else if (mContext instanceof ContextThemeWrapper) {
            return getFragmentManager(((ContextThemeWrapper) mContext).getBaseContext());
        }
// below if clause is for hilt library
 else if (mContext instanceof ViewComponentManager.FragmentContextWrapper) {
            return getFragmentManager(((ViewComponentManager.FragmentContextWrapper) mContext).getBaseContext());
        }
        return null;
    }

字符串

相关问题