Android开发:如何正确获取Tabbed Activity当前Tab编号并传值
正确获取当前Tab编号并传递到新Activity的方法
嘿,我明白你遇到的问题了——FragmentPagerAdapter的getItem()方法其实会提前预加载相邻的Fragment(默认预加载左右各一个),所以你在那里赋值的position_fragment最后拿到的往往不是当前显示的Tab位置,而是最后被创建的那个Fragment的位置,这就导致传递的编号不正确。
下面给你两种可靠的解决方式:
方法一:直接使用ViewPager的getCurrentItem()(最简单)
ViewPager本身就实时追踪着当前活跃的页面,所以直接调用它的getCurrentItem()方法就能拿到准确的当前Tab编号。修改你的FAB点击事件代码即可:
fab.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View view) { Intent startNewPostActivity = new Intent(getApplicationContext(), NewPostActivity.class); // 获取当前显示的Tab位置 int currentTabIndex = mViewPager.getCurrentItem(); startNewPostActivity.putExtra("Fragment_Position", currentTabIndex); startActivity(startNewPostActivity); } });
这种方式不需要额外维护变量,直接从ViewPager获取实时的当前页面位置,完全避开了Fragment预加载带来的问题。
方法二:监听ViewPager页面切换事件(适合需要全局使用当前Tab位置的场景)
如果你需要在多个地方用到当前Tab的位置,可以给ViewPager添加页面切换监听,实时更新一个全局变量:
- 先在Activity里声明一个变量:
private int currentTabPosition = 0; // 默认初始位置为0
- 在
onCreate()方法里添加ViewPager的页面切换监听:
mViewPager.addOnPageChangeListener(new ViewPager.SimpleOnPageChangeListener() { @Override public void onPageSelected(int position) { // 页面切换时更新当前Tab位置 currentTabPosition = position; } });
- 然后在FAB点击事件里使用这个变量:
fab.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View view) { Intent startNewPostActivity = new Intent(getApplicationContext(), NewPostActivity.class); startNewPostActivity.putExtra("Fragment_Position", currentTabPosition); startActivity(startNewPostActivity); } });
最后记得删除你之前在SectionsPagerAdapter.getItem()里给position_fragment赋值的代码,那个方法的调用时机和当前显示的页面没有直接关联,预加载机制会导致它返回的位置不准确。
内容的提问来源于stack exchange,提问作者Kurt Camilleri
相关产品推荐
相关产品推荐

