5

我有这段代码,我在适配器中单击 viewHolder 项目时显示对话框片段

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

最近我正在迁移到 Hilt,我得到了类转换异常,看起来 Hilt 包装了上下文,我无法让父Activity获得所需的FragmentManager来显示对话框

4

3 回答 3

13

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

private fun activityContext(): Context? {
    val context = itemView.context
    return if (context is ViewComponentManager.FragmentContextWrapper) {
        context.baseContext
    } else context
}
于 2020-08-18T00:49:36.490 回答
13

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

于 2020-11-26T13:51:50.383 回答
0

就我而言,我的自定义视图位于库模块中,即:(“com.android.library”),我在我的应用程序模块中使用刀柄,即:(“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;
    } 

如果是这种情况希望这应该对某人有所帮助。

快乐编码。

于 2021-12-29T19:32:04.933 回答