FragmentPagerAdapter已废弃(API 27起):最优替代方案及问题解决指南
嘿,如果你还在项目里用FragmentPagerAdapter,得注意啦——从API 27开始它就被标记为废弃了,官方推荐用FragmentStateAdapter搭配ViewPager2来替代。下面我给你整理了完整的改造步骤和代码对比,帮你快速完成适配:
旧代码实现(基于废弃的FragmentPagerAdapter)
首先看一下原来用FragmentPagerAdapter写的适配器:
导入语句:
import androidx.fragment.app.FragmentManager; import androidx.fragment.app.FragmentPagerAdapter;
适配器代码:
public class PagerAdapter extends FragmentPagerAdapter { public PagerAdapter(@NonNull FragmentActivity fragmentActivity) { super(fragmentActivity); } int tab_count; public PagerAdapter(@NonNull FragmentManager fm, int behavior) { super(fm, behavior); tab_count=behavior; } @NonNull @Override public Fragment getItem(int position) { switch (position) { case 0 : return new Ftab1(); case 1 : return new ftab2(); case 2 : return new Ftab3(); default: return null; } } @Override public int getCount() { return tab_count; } }
改造核心步骤
要完成适配,只需要这三步:
- 替换适配器类:把继承的
FragmentPagerAdapter改为FragmentStateAdapter - 替换布局组件:将布局文件里的
<ViewPager>替换为<ViewPager2> - 适配核心方法:把原有的
getItem()方法替换为createFragment(),getCount()替换为getItemCount(),同时可以用数组管理页面名称/数量,逻辑更清晰
新代码实现(基于FragmentStateAdapter)
改造后的适配器代码如下:
适配器代码:
import androidx.fragment.app.Fragment; import androidx.fragment.app.FragmentActivity; import androidx.viewpager2.adapter.FragmentStateAdapter; public class PagerAdapter extends FragmentStateAdapter { // 用数组管理页面名称,同时可以直接通过数组长度获取页面数量 String[] fragment_names = new String[]{"chat","status","call"}; public PagerAdapter(@NonNull FragmentActivity fragmentActivity) { super(fragmentActivity); } @NonNull @Override public Fragment createFragment(int position) { switch (position) { case 0 : return new Ftab1(); case 1 : return new ftab2(); case 2 : return new Ftab3(); default: return null; } } @Override public int getItemCount() { // 直接返回数组长度,不用单独维护tab_count变量 return fragment_names.length; } }
另外别忘了在XML布局里把ViewPager改成ViewPager2,示例如下:
<!-- 旧的ViewPager布局 --> <androidx.viewpager.widget.ViewPager android:id="@+id/viewPager" android:layout_width="match_parent" android:layout_height="match_parent"/> <!-- 新的ViewPager2布局 --> <androidx.viewpager2.widget.ViewPager2 android:id="@+id/viewPager" android:layout_width="match_parent" android:layout_height="match_parent"/>
内容的提问来源于stack exchange,提问作者Shyam Buhecha




