我在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()
时,它们将为您提供应用程序,而不是活动主题的上下文。
记住什么:
Activity
扩展了Context
,所以忘记getBaseContext()
- 使用视图时,需要主题的上下文。如果您在
View
中,请使用getContext()
。如果您在Activity
中,请使用this
。如果您在Fragment
内,请使用getContext()
。使用视图时,忘记getApplicationContext()
-
您的适配器在构造函数中不需要
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
构造函数参数,该参数是您在活动中准备的(它知道如何执行片段事务(。