试图打开片段java.lang.ClassCastException中的片段:android.app.Applicati



我在recyclerViewAdapter中使用此代码。我需要从碎片中打开新的碎片。

@Override
public void onClick(View view) {
AppCompatActivity activity = (AppCompatActivity) view.getContext();

CarDetailFragment carDetailFragment = new CarDetailFragment();
FragmentManager  fragmentManager = activity.getSupportFragmentManager();
FragmentTransaction fragmentTransaction=fragmentManager.beginTransaction();
fragmentTransaction.replace(R.id.fragmentCar, carDetailFragment);
fragmentTransaction.addToBackStack(null);
fragmentTransaction.commit();
}

请检查下面的代码,您可以在片段中直接使用getContext(),并将其转换为当前片段的活动。

Context context= getContext();
CarDetailFragment carDetailFragment = new CarDetailFragment();
FragmentManager  fragmentManager = ((YOUR_ACTIVITY_NAME) context).getSupportFragmentManager();
FragmentTransaction fragmentTransaction=fragmentManager.beginTransaction();
fragmentTransaction.replace(R.id.fragmentCar, carDetailFragment);
fragmentTransaction.addToBackStack(null);
fragmentTransaction.commit();

在Fragment中声明一个公共静态上下文变量,并将getActivity分配给它,然后在Adapter中将此变量用于getSupportFragmentManager。

public static Context context; //declare the variable in your Fragment
context=getActivity;// assign it in your Fragment before calling Adapter

然后在适配器中像这样使用

FragmentManager fragmentManager= ((AppCompatActivity) YourFragmentName.context).getSupportFragmentManager();

编辑

由于静态上下文变量可能导致内存泄漏,因此您可以使用此

// while calling the adapter pass getActivity as context
MyAdapter myAdapter = new MyAdapter(getActivity, /* other variables */);

然后在适配器中像这样使用

private Context context;
public MyAdapter(Context context, /* Other part */ ) {
this.context = context;
//other part
}

FragmentManager fragmentManager= ((AppCompatActivity) context).getSupportFragmentManager();

请参考以下代码

public class NewAdapter extends RecyclerView.Adapter<NewAdapter.<Your-View-Holder-Name>> {
private FragmentActivity activity;
public ImageAdapter(FragmentActivity mActivity){
activity = mActivity;
}

将getActivity((更改为如下所述的活动

@Override
public void onClick(View view) {
FragmentManager  fragmentManager = activity.getSupportFragmentManager();
FragmentTransaction fragmentTransaction=fragmentManager.beginTransaction(); 
fragmentTransaction.replace(R.id.fragmentCar, carDetailFragment); 
fragmentTransaction.addToBackStack(null);
fragmentTransaction.commit();
}

当您在"活动"中创建Adapter类的实例时,请使用以下语法

mAdapter = new NewAdapter(MainActivityHomePage.this);

我猜您的RecyclerView适配器拥有对应用程序上下文的引用,您正在使用它来创建视图。然后,视图包含您用来创建它们的上下文,因此当您要求它们getContext()时,它们将为您提供应用程序,而不是活动主题的上下文。

记住什么:

  1. Activity扩展了Context,所以忘记getBaseContext()
  2. 使用视图时,需要主题的上下文。如果您在View中,请使用getContext()。如果您在Activity中,请使用this。如果您在Fragment内,请使用getContext()。使用视图时,忘记getApplicationContext()
  3. 您的适配器在构造函数中不需要Context。唯一需要上下文的地方是在创建视图时,您可以从将显示项目的RecyclerView中获得正确的Context

    @Override 
    public ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
    // parent is the RecyclerView.
    Context context = parent.getContext();
    // TODO Inflate your view and return view holder.
    }
    

即使你遵循了所有这些,你也不能保证View.getContext()会给你一个Activity。它可能是CCD_ 19。

开始思考应用程序架构。适配器可能不应该知道任何关于活动、片段或片段事务的信息。适配器应该获取数据并将它们转换为视图。在另一个方向上,它应该接受用户的点击,并通知某个侦听器。适配器应该采用onClickListener构造函数参数,该参数是您在活动中准备的(它知道如何执行片段事务(。

最新更新