Запуск диалогового фрагмента из адаптера

#java #android #android-adapter #android-dialogfragment

#java #Android #android-адаптер #android-диалоговый фрагмент

Вопрос:

Существует a RecyclerView , в котором есть an item , мне нужно открыть DialogFragment его по щелчку мыши.

Чтобы переключиться на обычное Fragment использование, я пишу следующее:

   holder.ll_main.setOnClickListener(v -> {
            FragmentBabyIsland fragment = new FragmentBabyIsland(); // you fragment
            FragmentManager fragmentManager = ((FragmentActivity) v.getContext()).getSupportFragmentManager(); // instantiate your view context
            FragmentTransaction fragmentTransaction = fragmentManager.beginTransaction();
            fragmentTransaction.setCustomAnimations(R.animator.nav_default_enter_anim, R.animator.nav_default_exit_anim,
                    R.animator.nav_default_pop_enter_anim, R.animator.nav_default_pop_exit_anim);
            fragmentTransaction.replace(R.id.fragment, fragment);// your container and your fragment
            fragmentTransaction.addToBackStack("tag");
            fragmentTransaction.commit();

        });
 

Чтобы перейти к DialogFragment, я пишу следующее

  holder.ll_main.setOnClickListener(v -> {
            openDialog();
        });

    private void openDialog() {
        DialogSort dialogSort = new DialogSort();
        dialogSort.show(requireActivity().getSupportFragmentManager(), "SortDialog");
    }
 

Но из-за того, что это Адаптер, он ругается на requireActivity()
Как это исправить?

Комментарии:

1. Вы можете использовать v.getContext() для получения контекста . в конечном ((AppCompatActivity)v.getContext()).getSupportFragmentManager() счете . Или вместо того , чтобы делать это , вы можете предоставить интерфейс обратного вызова вызывающему компоненту и написать openDialog там код . Или у вас может быть поле конструктора в адаптере. использование интерфейса обратного вызова — лучший вариант .

Ответ №1:

В вашем адаптере определите Activity как:

 private AppCompatActivity mActivity;
 

Затем измените свой конструктор на:

 public MyAdapter ( AppCompatActivity activity , ArrayList<MyItem> list ) {
    this.mActivity = activity;
}
 

После того, как вы сделаете это, вы можете использовать mActivity для отображения диалогового окна:

 DialogSort dialogSort = new DialogSort();
dialogSort.show( mActivity.getSupportFragmentManager(), "SortDialog");
 

Обратите внимание, что если вы уже используете Context , замените его на AppCompatActivity или используйте их оба в конструкторе. Было бы лучше, если бы вы просто заменили его.