Android:FragmentPagerAdapter已弃用,Java代码适配方案求助
解决FragmentPagerAdapter已弃用的Java方案
别担心,我来帮你搞定这个FragmentPagerAdapter弃用的问题,整理了两种适配Java的解决方案——官方推荐的ViewPager2迁移方案,以及临时过渡的替代方案,你可以根据需求选择:
方案一:迁移到ViewPager2(官方推荐)
FragmentPagerAdapter和FragmentStatePagerAdapter都已经被标记为弃用,Android官方更推荐使用ViewPager2,它解决了旧ViewPager的很多痛点,比如支持垂直滚动、更好的性能和生命周期管理。下面是具体的Java实现步骤:
1. 替换布局中的ViewPager为ViewPager2
把原来布局里的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" />
2. 编写适配ViewPager2的Java适配器
创建一个继承自FragmentStateAdapter的适配器类,替换原来的FragmentPagerAdapter:
package com.sweetieapps.librarianpro; import androidx.annotation.NonNull; import androidx.fragment.app.Fragment; import androidx.fragment.app.FragmentActivity; import androidx.viewpager2.adapter.FragmentStateAdapter; import java.util.ArrayList; import java.util.List; public class ViewPager2Adapter extends FragmentStateAdapter { private final List<Fragment> fragmentList = new ArrayList<>(); private final List<String> fragmentListTitles = new ArrayList<>(); // 如果你在Activity中使用,用这个构造方法 public ViewPager2Adapter(@NonNull FragmentActivity fragmentActivity) { super(fragmentActivity); } // 如果你在Fragment中使用,用这个构造方法 /* public ViewPager2Adapter(@NonNull Fragment fragment) { super(fragment); } */ @NonNull @Override public Fragment createFragment(int position) { return fragmentList.get(position); } @Override public int getItemCount() { return fragmentList.size(); } // 用于获取页面标题,配合TabLayout使用 public String getPageTitle(int position) { return fragmentListTitles.get(position); } public void addFragment(Fragment fragment, String title) { fragmentList.add(fragment); fragmentListTitles.add(title); } }
3. 在代码中设置适配器并关联TabLayout(如果有)
如果你的页面搭配TabLayout使用,需要借助TabLayoutMediator来关联两者:
// 初始化ViewPager2和适配器 ViewPager2 viewPager = findViewById(R.id.viewPager); ViewPager2Adapter adapter = new ViewPager2Adapter(this); adapter.addFragment(new YourFirstFragment(), "书架"); adapter.addFragment(new YourSecondFragment(), "统计"); viewPager.setAdapter(adapter); // 关联TabLayout TabLayout tabLayout = findViewById(R.id.tabLayout); new TabLayoutMediator(tabLayout, viewPager, (tab, position) -> { tab.setText(adapter.getPageTitle(position)); }).attach();
方案二:临时过渡,改用FragmentStatePagerAdapter
如果你暂时不想迁移到ViewPager2,可以将原来的FragmentPagerAdapter替换为FragmentStatePagerAdapter,代码改动很小,能直接消除弃用警告:
package com.sweetieapps.librarianpro; import androidx.annotation.NonNull; import androidx.annotation.Nullable; import androidx.fragment.app.Fragment; import androidx.fragment.app.FragmentManager; import androidx.fragment.app.FragmentStatePagerAdapter; import java.util.ArrayList; import java.util.List; public class ViewPagerAdapter extends FragmentStatePagerAdapter { private final List<Fragment> fragmentList = new ArrayList<>(); private final List<String> fragmentListTitles = new ArrayList<>(); // 注意要传入behavior参数,推荐用BEHAVIOR_RESUME_ONLY_CURRENT_FRAGMENT优化生命周期 public ViewPagerAdapter(@NonNull FragmentManager fm, int behavior) { super(fm, behavior); } @NonNull @Override public Fragment getItem(int i) { return fragmentList.get(i); } @Override public int getCount() { return fragmentListTitles.size(); } @Nullable @Override public CharSequence getPageTitle(int position) { return fragmentListTitles.get(position); } void addFragment(Fragment fragment, String title){ fragmentList.add(fragment); fragmentListTitles.add(title); } }
然后在创建适配器的时候,传入BEHAVIOR_RESUME_ONLY_CURRENT_FRAGMENT参数:
ViewPager viewPager = findViewById(R.id.viewPager); ViewPagerAdapter adapter = new ViewPagerAdapter( getSupportFragmentManager(), FragmentStatePagerAdapter.BEHAVIOR_RESUME_ONLY_CURRENT_FRAGMENT ); adapter.addFragment(new YourFirstFragment(), "书架"); adapter.addFragment(new YourSecondFragment(), "统计"); viewPager.setAdapter(adapter);
小提示
虽然过渡方案能快速解决警告,但还是建议尽早迁移到ViewPager2,它的功能更完善,后续维护也更省心~
内容的提问来源于stack exchange,提问作者WizardingStudios




