Mohamed Ibrahim
Mohamed Ibrahim

Reputation: 3924

Hilt ClassCastException: ViewComponentManager$FragmentContextWrapper cannot be cast to AppCompatActivity

I have this code where I show Dialog Fragment when clicking a viewHolder item in Adapter

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

recently I'm migrating to Hilt and I got class cast exception, looks like Hilt wrapping the context and I can't get the parent Activity to get the required FragmentManager to show the Dialog

Upvotes: 10

Views: 8156

Answers (3)

Zeeshan Akhtar
Zeeshan Akhtar

Reputation: 521

In my case, my custom view is in the library module i.e: ("com.android.library"), and I am using hilt in my App module i.e: ("com.android.application") due to this my application is crashing. because I am using the Hilt library in my App Module, and context instances are created by the Hilt library. and I am unable to find fragmentManger.

so as a workaround I have to add Hilt in my library module and then I used the below code to find the 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;
    } 

Upvotes: 1

stronglee1346
stronglee1346

Reputation: 306

I read source code find this solution FragmentComponentManager.findActivity(view.context) as Activity

Upvotes: 29

Mohamed Ibrahim
Mohamed Ibrahim

Reputation: 3924

I may found a workaround to this crash by checking the Context type and getting the BaseContext. Here's what I'm using now. I don't know if there's a better way to do it with Hilt.

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

Upvotes: 20

Related Questions