如何在父Activity中判断用户当前查看的Fragment?
判断ViewPager中当前显示的Fragment
你可以通过几种简单的方式在父Activity里判断当前处于哪个Fragment,结合你现有的代码,我给你整理了几个实用的方法:
方法一:通过ViewPager的当前页面索引直接判断
因为你已经按固定顺序给Adapter添加了四个Fragment,所以可以直接获取ViewPager的当前选中位置,对应到具体的Fragment:
// 在父Activity中调用这段代码 int currentPosition = viewPager.getCurrentItem(); switch(currentPosition) { case 0: // 当前显示的是AdminFragment break; case 1: // 当前显示的是MemberFragment break; case 2: // 当前显示的是JoinFragment break; case 3: // 当前显示的是WebFragment break; }
如果想要更灵活地获取Fragment实例,可以给你的ViewPagerAdapter加一个获取Fragment的方法:
public class ViewPagerAdapter extends FragmentPagerAdapter { private final List<Fragment> mFragmentList = new ArrayList<>(); private final List<String> mFragmentTitleList = new ArrayList<>(); public ViewPagerAdapter(FragmentManager manager) { super(manager); } @Override public Fragment getItem(int position) { return mFragmentList.get(position); } @Override public int getCount() { return mFragmentList.size(); } public void addFragment(Fragment fragment, String title) { mFragmentList.add(fragment); mFragmentTitleList.add(title); } @Override public CharSequence getPageTitle(int position) { return mFragmentTitleList.get(position); } // 新增:根据位置获取对应Fragment的方法 public Fragment getFragment(int position) { return mFragmentList.get(position); } }
之后在父Activity里就能直接拿到当前Fragment实例做判断:
ViewPagerAdapter adapter = (ViewPagerAdapter) viewPager.getAdapter(); Fragment currentFragment = adapter.getFragment(viewPager.getCurrentItem()); if (currentFragment instanceof AdminFragment) { // 确认当前是AdminFragment,执行对应逻辑 } else if (currentFragment instanceof MemberFragment) { // 当前是MemberFragment的处理逻辑 } // 其他Fragment的判断以此类推
方法二:监听ViewPager页面切换事件
如果需要在页面切换时实时感知当前Fragment,可以给ViewPager设置页面切换监听:
如果用的是ViewPager2(推荐使用的新版本):
viewPager.registerOnPageChangeCallback(new ViewPager2.OnPageChangeCallback() { @Override public void onPageSelected(int position) { super.onPageSelected(position); // 页面切换完成时触发,在这里判断当前Fragment ViewPagerAdapter adapter = (ViewPagerAdapter) viewPager.getAdapter(); Fragment currentFragment = adapter.getFragment(position); if (currentFragment instanceof AdminFragment) { // 处理AdminFragment显示后的逻辑 } // 其他Fragment的判断逻辑同上 } });
如果用的是旧版ViewPager:
viewPager.setOnPageChangeListener(new ViewPager.OnPageChangeListener() { @Override public void onPageScrolled(int position, float positionOffset, int positionOffsetPixels) {} @Override public void onPageSelected(int position) { // 页面选中时执行判断逻辑,和上面的写法一致 ViewPagerAdapter adapter = (ViewPagerAdapter) viewPager.getAdapter(); Fragment currentFragment = adapter.getFragment(position); // ...后续判断代码 } @Override public void onPageScrollStateChanged(int state) {} });
方法三:通过FragmentManager查找当前Fragment
你也可以利用FragmentManager的tag来查找当前Fragment,旧版ViewPager的Fragment默认tag格式是android:switcher:[viewPager的ID]:[页面位置],所以可以这样写:
int currentPosition = viewPager.getCurrentItem(); String currentFragmentTag = "android:switcher:" + viewPager.getId() + ":" + currentPosition; Fragment currentFragment = getSupportFragmentManager().findFragmentByTag(currentFragmentTag); if (currentFragment instanceof AdminFragment) { // 确认当前Fragment类型 }
这几种方法里,方法一和方法二是最常用、最直观的,你可以根据自己的需求来选择~
内容的提问来源于stack exchange,提问作者Ankur Kalita
相关产品推荐
相关产品推荐

