Actionbar setTitle()在OnPageChangeListener中仅生效一次的问题
解决ViewPager切换时ActionBar标题仅生效一次的问题
这种问题我开发时也碰到过!大概率是你的监听逻辑或者ActionBar引用出了问题,咱们一步步排查解决:
核心问题分析
通常这个情况的原因有几个:
- 在错误的监听方法里设置标题(比如
onPageScrolled而不是onPageSelected) - ActionBar的引用不稳定,每次获取的实例不一致
- PagerAdapter没有正确返回对应页面的标题
解决方案代码示例
首先,咱们把ActionBar的引用改成全局变量,避免在监听里重复获取导致的问题:
private ActionBar mActionBar; private Toolbar mToolbar; // 也可以直接持有Toolbar引用 @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_single_news); mToolbar = findViewById(R.id.toolbar); setSupportActionBar(mToolbar); mActionBar = getSupportActionBar(); if (mActionBar != null) { mActionBar.setDisplayHomeAsUpEnabled(true); mActionBar.setDisplayShowTitleEnabled(true); } // 初始化ViewPager和自定义Adapter ViewPager pager = findViewById(R.id.viewpager); MyPageAdapter adapter = new MyPageAdapter(getSupportFragmentManager()); pager.setAdapter(adapter); // 设置页面切换监听 pager.addOnPageChangeListener(new ViewPager.OnPageChangeListener() { @Override public void onPageScrolled(int position, float positionOffset, int positionOffsetPixels) { // 这个方法在滚动过程中会频繁触发,绝对不要在这里设置标题! } @Override public void onPageSelected(int position) { // 只有页面完全选中时才触发这个方法,适合设置标题 if (mActionBar != null) { // 从Adapter获取对应位置的标题 String pageTitle = adapter.getPageTitle(position).toString(); mActionBar.setTitle(pageTitle); } // 或者直接操作Toolbar(有时候比ActionBar更可靠) // mToolbar.setTitle(adapter.getPageTitle(position)); } @Override public void onPageScrollStateChanged(int state) { // 状态变化时的逻辑,不需要处理标题 } }); }
确保PagerAdapter正确实现标题方法
你的PagerAdapter必须正确重写getPageTitle方法,这样才能拿到对应页面的标题:
private class MyPageAdapter extends FragmentPagerAdapter { // 这里替换成你的页面标题数组 private final String[] PAGE_TITLES = {"科技新闻", "娱乐资讯", "体育动态"}; public MyPageAdapter(FragmentManager fm) { super(fm); } @Override public Fragment getItem(int position) { // 返回对应位置的Fragment return NewsFragment.newInstance(position); } @Override public int getCount() { return PAGE_TITLES.length; } @Override public CharSequence getPageTitle(int position) { return PAGE_TITLES[position]; } }
额外排查点
如果还是不行,可以检查这几个地方:
- 有没有其他代码(比如Fragment的
onResume)在修改标题,导致被覆盖 - 尝试清理项目缓存,重新编译(有时候Android Studio的缓存会导致奇怪的问题)
- 确认
setDisplayShowTitleEnabled(true)已经开启,没有被其他逻辑关闭
内容的提问来源于stack exchange,提问作者Jyoti JK
相关产品推荐
相关产品推荐

