android 从子片段更改Viewpager2片段

jvlzgdj9  于 2023-02-06  发布在  Android
关注(0)|答案(1)|浏览(187)

我在主活动中有一个主片段/ViewPager片段,主片段有Viewpager2,我在其中通过适配器将子片段添加到ViewPager。之前我在主活动中有一个方法(也有视图分页器)

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

当我从viewpager的任何子片段调用时,这个方法很容易改变片段,但是由于我将viewpager移到了Main片段,所以我的viewpager总是从子片段返回null。

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的子片段更改片段?

rdrgkggo

rdrgkggo1#

MainFragment.newInstance().ChangeFragment_ViewPager(0,false);
这行代码示例化了一个全新的MainFragment示例;因此您找到了空的ViewPager
相反,需要片段管理器中存在的当前示例,或者简单地使用ViewPager子页面片段中的requireParentFragment()来获得托管ViewPagerMainFragment

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

相关问题