Заменить один фрагмент в PageView - PullRequest
0 голосов
/ 28 марта 2020
  • Текущая ситуация

В настоящее время мое приложение имеет меню навигации снизу, и каждый элемент в этом меню имеет свое меню вкладок.

  • Проблема

У меня есть кнопка внутри одной из моих вкладок, и я хочу, чтобы, когда пользователь нажимает кнопку, отображался новый фрагмент. Но, поскольку это меню вкладок, фрагменты отображаются через ViewPager, и я не знаю, как открыть новый фрагмент таким образом. Я попытался заменить ViewPager, но у меня ничего не вышло, просто ничего не появляется, когда я нажимаю кнопку.

  • последовательность фрагментов

1-й - ProfessionalFragment (это фрагмент, открытый при нажатии на нижнее меню навигации. Именно здесь я создаю экземпляр ViewPager)

2nd - EducationFragment (Этот фрагмент является Вкладка меню вкладки ProfessionalFragment. Это фрагмент с кнопкой для открытия нового фрагмента)

3-й - BasicCoursesFragment (это фрагмент, который я хочу открыть, нажав на кнопку в EducationFragment)

Ниже приведены коды:

ProfessionalFragment

public class ProfessionalFragment extends Fragment {

    private ProfessionalViewModel dashboardViewModel;

    public View onCreateView(@NonNull LayoutInflater inflater,
                             ViewGroup container, Bundle savedInstanceState) {
        dashboardViewModel =
                ViewModelProviders.of(this).get(ProfessionalViewModel.class);
        View root = inflater.inflate(R.layout.fragment_professional, container, false);

        SectionsPagerAdapter sectionsPagerAdapter = new SectionsPagerAdapter(getActivity(), getChildFragmentManager());
        ViewPager viewPager = root.findViewById(R.id.viewPagerProfessional);
        viewPager.setAdapter(sectionsPagerAdapter);
        TabLayout tabs = root.findViewById(R.id.tabsProfessional);
        tabs.setupWithViewPager(viewPager);

        return root;
    }
}

class SectionsPagerAdapter extends FragmentPagerAdapter {

    @StringRes
    private static final int[] TAB_TITLES = new int[]{R.string.title_work, R.string.title_education};
    private final Context mContext;

    public SectionsPagerAdapter(Context context, FragmentManager fm) {
        super(fm);
        mContext = context;
    }

    @Override
    public Fragment getItem(int position) {
        Fragment fragment = null;
        switch (position) {
            case 0:
                fragment = new WorkFragment();
                break;
            case 1:
                fragment = new EducationFragment();
                break;
        }
        return fragment;
    }

    @Nullable
    @Override
    public CharSequence getPageTitle(int position) {
        return mContext.getResources().getString(TAB_TITLES[position]);
    }

    @Override
    public int getCount() {
        return 2;
    }
}

EducationFragment

public class EducationFragment extends Fragment {


    @Override
    public View onCreateView(LayoutInflater inflater, ViewGroup container,
                             Bundle savedInstanceState) {
        // Inflate the layout for this fragment
        View root = inflater.inflate(R.layout.fragment_education, container, false);

        Button basicCourses = root.findViewById(R.id.button_basic_courses);
        basicCourses.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                FragmentTransaction ft = getFragmentManager().beginTransaction();

                BasicCoursesFragment basicCoursesFragment = new BasicCoursesFragment();
                ft.replace(R.id.viewPagerProfessional, basicCoursesFragment);
                ft.addToBackStack(null);
                ft.commit();
            }
        });

        return root;
    }
}

Буду благодарен за помощь.

1 Ответ

0 голосов
/ 28 марта 2020

Вы можете установить связь фрагмента EducationFragment с activity с помощью интерфейсов. Проверьте эту ссылку Общение с деятельностью . Затем вы можете заменить контейнер, содержащий фрагмент ProfessionalFragment, вашим целевым фрагментом BasicCoursesFragment. Переместите следующее в свою деятельность

FragmentTransaction ft = getFragmentManager().beginTransaction();

BasicCoursesFragment basicCoursesFragment = new BasicCoursesFragment();
ft.replace(/** Replace this with the container that contain ProfessionalFragment*/, basicCoursesFragment);
ft.addToBackStack(null);
ft.commit();
...