You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

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

火山引擎 最新活动