пытается открыть фрагмент из фрагмента java .lang.ClassCastException: android .app.Application не может быть приведен к androidx.appcompat.app.AppCompatActivity - PullRequest
0 голосов
/ 17 апреля 2020

Я использую этот код в 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();
    }

Ответы [ 4 ]

1 голос
/ 17 апреля 2020

Пожалуйста, проверьте код ниже, и вы можете направить 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();
0 голосов
/ 17 апреля 2020

Полагаю, ваш RecyclerView адаптер содержит ссылку на контекст приложения, и вы используете его для создания представлений. Затем представления содержат контекст, который вы использовали для их создания, поэтому, когда вы попросите их getContext(), они предоставят вам приложение вместо тематического контекста активность .

Что имейте в виду:

  1. Activity расширяет Context, поэтому забудьте о getBaseContext().
  2. При работе с представлениями вам нужен тематический контекст . Если вы внутри View, используйте getContext(). Если вы внутри Activity, используйте this. Если вы внутри Fragment, используйте getContext(). Забудьте о getApplicationContext() при работе с представлениями.
  3. Вашему адаптеру не требуется Context в конструкторе. Единственное место, в котором вам нужен контекст - это при создании представлений, и вы можете получить Context из 1029 *, который будет отображать элементы.

    @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. Это может быть ContextThemeWrapper.

Начните думать об архитектуре приложения. Адаптер, вероятно, не должен ничего знать о действиях, фрагментах или фрагментных транзакциях. Адаптер должен взять данные и превратить их в представления. В другом направлении он должен принимать клики от пользователя и уведомлять какого-нибудь слушателя. Адаптер должен принимать параметр конструктора onClickListener, который вы подготовили внутри действия (который знает, как выполнять фрагментированные транзакции).

0 голосов
/ 17 апреля 2020

Пожалуйста, используйте ссылку из кода ниже.

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 в Activity, используйте следующий синтаксис ..

 mAdapter = new NewAdapter(MainActivityHomePage.this);
0 голосов
/ 17 апреля 2020

Объявите переменную контекста publi c stati c в вашем фрагменте и присвойте ему getActivity, а затем используйте эту переменную в Adapter для вашего getSupportFragmentManager.

public static Context context; //declare the variable in your Fragment

context=getActivity;// assign it in your Fragment before calling Adapter

Затем в Adapter используйте его следующим образом

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

EDIT

Поскольку переменная контекста stati c может вызвать утечку памяти, поэтому вы можете использовать эту

    // 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();
...