У меня есть основной фрагмент/фрагмент 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?
@Zain Я обновил вопрос с помощью табапатера, который я использую. пожалуйста, проверьте
Извините, если это было непонятно; Я имею в виду, как вы добавляете mainFragment в основную активность.. Вы добавляете его в макет или через supportManager.. что-то вроде developer.android.com/guide/fragments/transactions
@Зайн getSupportFragmentManager().beginTransaction() .setReorderingAllowed(true) .add(R.id.Navigation_Main_Layout,MainFragment.class,null) .commit();
@Zain Так добавляет менеджер поддержки.
MainFragment.newInstance().ChangeFragment_ViewPager(0,false);
Эта строка кода создает новый экземпляр MainFragment
; и поэтому вы нашли ноль ViewPager
.
Вместо этого требуется текущий экземпляр, существующий в диспетчере фрагментов, или просто используйте requireParentFragment()
из ViewPager
фрагмента дочерней страницы, чтобы получить MainFragment
, на котором размещен ViewPager
:
((MainFragment) requireParentFragment()).ChangeFragment_ViewPager(0, false);
Спасибо, это действительно быстрое решение. но я думаю, что getsupportfragmentmanager
- правильный вариант для начала первого фрагмента.
Можете ли вы поделиться тем, как выполнить транзакцию MainFragment в supportManager?