将View.getContext()投射到androidx.appcompat.app.AppCompatActivity时发生ClassCastException

时间:2019-11-12 12:01:55

标签: android android-fragments classcastexception androidx fragmentmanager

当我尝试从适配器启动片段时,出现此异常。

我寻找了类似的问题,但是转换为androidX相对较新,因此我找不到相关的解决方案。 我找到了在创建Adapter对象时将FragmentManager传递给构造函数的解决方案。这还需要初始化FragmentMAnager,这就是我再次陷入困境的地方。

该过程的代码为:

AppCompatActivity activity = (AppCompatActivity) v.getContext();
    int id = currentCountry.getId();

    Fragment mdf = new DetailsFragment();

    activity.getSupportFragmentManager()
            .beginTransaction()
            .replace(R.id.fragments_container, mdf)
            .addToBackStack(null)
            .commit();

异常消息是

java.lang.ClassCastException: android.app.Application cannot be cast to androidx.appcompat.app.AppCompatActivity.

有解决方案的想法吗?也许最后一个选择将是从androidX还原回android。

是否需要其他代码来解决此问题?

2 个答案:

答案 0 :(得分:0)

我认为这很完美

将((YOUR_ACTIVITY_NAME)ADAPTER_CONTEXT)替换为活动,以便获得当前活动

int id = currentCountry.getId();

Fragment mdf = new DetailsFragment();

((YOUR_ACTIVITY_NAME) ADAPTER_CONTEXT).getSupportFragmentManager()
        .beginTransaction()
        .replace(R.id.fragments_container, mdf)
        .addToBackStack(null)
        .commit();

答案 1 :(得分:0)

View.getContext()不必返回Context中的Activity。基本上它可以是用来扩充此视图的任何Context。在您的情况下,Context是用于在适配器中扩充视图的ApplicationContext。为了快速修复,您可以更改Context的{​​{1}}方法中使用的onCreateViewHolder。我不确定您如何提高您的回收站视图,但可以考虑在RecyclerAdapter中使用parent.getContext()

但是,最好在适配器中创建回调并将click事件委托给onCreateViewHolder的所有者。