如何在 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获取当前片段:
ViewPager2
有 getCurrentItem()
其中 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
});
MyFragment currentFragment = (MyFragment) getSupportFragmentManager()
.findFragmentByTag("f"+pagerMainAdapter.getItemId(0));
currentFragment.testRun("Hello world");
我正在尝试从 ViewPager
迁移到 ViewPager2
,但我不知道如何在 ViewPager2
中获取片段。
从ViewPager2获取当前片段:
ViewPager2
有 getCurrentItem()
其中 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
});