Изменить фрагмент Viewpager2 из дочернего фрагмента

У меня есть основной фрагмент/фрагмент ViewPager внутри основного действия, а основной фрагмент имеет Viewpager2, где я добавляю дочерние фрагменты в ViewPager через адаптер. Ранее у меня был метод в основном действии (у которого также был просмотр пейджера)

public void ChangeFragment_ViewPager(int position, boolean outside) {
        if (viewPager!=null){
            viewPager.setCurrentItem(position);
        }    
    }

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

 MainFragment.newInstance().ChangeFragment_ViewPager(0, false);

Основной фрагмент

public class MainFragment extends Fragment {
    ViewPager2 viewPager;
    public MainFragment() {
        // Required empty public constructor
    }


    // TODO: Rename and change types and number of parameters
    public static MainFragment newInstance() {
        MainFragment fragment = new MainFragment();
        Bundle args = new Bundle();
        fragment.setArguments(args);
        return fragment;
    }


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

    @Override
    public void onViewCreated(@NonNull View view, @Nullable Bundle savedInstanceState) {
        super.onViewCreated(view, savedInstanceState);
        viewPager = view.findViewById(R.id.Navigation_Drawer_ViewPager);
        TabAdapter tabAdapter = new TabAdapter(getChildFragmentManager(), getLifecycle());
        viewPager.setAdapter(tabAdapter);
    }

   
    public void ChangeFragment_ViewPager(int position, boolean outside) {
        if (viewPager!=null){
            viewPager.setCurrentItem(position);
        }

    }

Адаптер вкладки

public class TabAdapter extends FragmentStateAdapter {
    String TAG = "###TAB ADAPTER###";

    public TabAdapter(@NonNull FragmentManager fragmentManager, @NonNull Lifecycle lifecycle) {
        super(fragmentManager, lifecycle);
    }


    @NonNull
    @Override
    public Fragment createFragment(int position) {
        switch (position) {
            case 0:
                Log.d(TAG, "Fragment 1");
                return FriendsList.newInstance();
            case 1:
                Log.d(TAG, "Fragment 2");
                return PPL_main.newInstance();
        }
        return FriendsList.newInstance();
    }

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

Как я могу изменить фрагмент из любого дочернего фрагмента ViewPager?

Можете ли вы поделиться тем, как выполнить транзакцию MainFragment в supportManager?

Zain 05.02.2023 17:25

@Zain Я обновил вопрос с помощью табапатера, который я использую. пожалуйста, проверьте

Ritu 05.02.2023 17:41

Извините, если это было непонятно; Я имею в виду, как вы добавляете mainFragment в основную активность.. Вы добавляете его в макет или через supportManager.. что-то вроде developer.android.com/guide/fragments/transactions

Zain 05.02.2023 17:56

@Зайн getSupportFragmentManager().beginTransaction() .setReorderingAllowed(true) .add(R.id.Navigation_Main_Layout,MainFragment.class,null) .commit();

Ritu 05.02.2023 18:14

@Zain Так добавляет менеджер поддержки.

Ritu 05.02.2023 18:41
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
В компьютерном программировании биты играют важнейшую роль в представлении и манипулировании данными на двоичном уровне. Побитовые операции...
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Приходилось ли вам сталкиваться с требованиями, в которых вас могли попросить поднять тревогу или выдать ошибку, когда метод Java занимает больше...
Полный курс Java для разработчиков веб-сайтов и приложений
Полный курс Java для разработчиков веб-сайтов и приложений
Получите сертификат Java Web и Application Developer, используя наш курс.
0
5
56
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

MainFragment.newInstance().ChangeFragment_ViewPager(0,false);

Эта строка кода создает новый экземпляр MainFragment; и поэтому вы нашли ноль ViewPager.

Вместо этого требуется текущий экземпляр, существующий в диспетчере фрагментов, или просто используйте requireParentFragment() из ViewPager фрагмента дочерней страницы, чтобы получить MainFragment, на котором размещен ViewPager:

((MainFragment) requireParentFragment()).ChangeFragment_ViewPager(0, false);

Спасибо, это действительно быстрое решение. но я думаю, что getsupportfragmentmanager - правильный вариант для начала первого фрагмента.

Ritu 05.02.2023 22:54

Другие вопросы по теме