如何在 FragmentStateAdapter 中获取片段

How to get a fragment in FragmentStateAdapter

MyFragment currentFragment = (MyFragment) getSupportFragmentManager()
                                   .findFragmentByTag("f"+pagerMainAdapter.getItemId(0));
currentFragment.testRun("Hello world");

我正在尝试从 ViewPager 迁移到 ViewPager2,但我不知道如何在 ViewPager2 中获取片段。

从ViewPager2获取当前片段:

ViewPager2getCurrentItem() 其中 returns 当前页码 所以,我们需要link每个页面片段到相应的页码。

但是我们可以通过它的id(项目id)得到一个ViewPager2片段,所以第一步是让页面Id等于相应的位置,这样做覆盖getItemId ViewPager2 FragmentStateAdapter.

@Override
public long getItemId(int position) {
    return position;
}

然后获取当前片段:

int pageId = viewpager.getCurrentItem();

MyFragment currentFragment = (MyFragment) getSupportFragmentManager()
                                              .findFragmentByTag("f" + pageId);

编辑:

除了这个问题,使用 "f$id" 获取 viewPager 片段可能会在某一天被 Google 在内部 API 中停止;所以你应该使用另一种方式;这是一个可以在 API 24+:

中使用的

使用 newInstance 页面片段模式,您可以在 viewPager 页面片段中设置一些参数,假设 viewPager 片段是 PagerFragment:

参数常量:

public static final String POSITION = "POSITION";

适配器:

class ViewPagerFragmentAdapter extends FragmentStateAdapter {
    
    ....

    @NonNull
    @Override
    public Fragment createFragment(int position) {
        return PagerFragment.newInstance(position);
    }

}

页面片段:

public class PagerFragment extends Fragment {

    public static Fragment newInstance(int position) {
        PagerFragment fragment = new PagerFragment();
        Bundle args = new Bundle();
        args.putInt(POSITION, position);
        fragment.setArguments(args);
        return fragment;
    }
}

并获取某个 viewPager 项目的片段:

int id = pagerMainAdapter.getItemId(0); // id of your ViewPager that you need to get the corresponding PageFragment

    Optional<Fragment> optionalFragment =
            getSupportFragmentManager().getFragments().stream()
                    .filter(it -> it instanceof PagerFragment && it.getArguments() != null && it.getArguments().getInt(POSITION) == id)
                    .findFirst();

optionalFragment.ifPresent(fragment -> {
    // This is your needed PageFragment
});