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

Android:FragmentPagerAdapter已弃用,Java代码适配方案求助

解决FragmentPagerAdapter已弃用的Java方案

别担心,我来帮你搞定这个FragmentPagerAdapter弃用的问题,整理了两种适配Java的解决方案——官方推荐的ViewPager2迁移方案,以及临时过渡的替代方案,你可以根据需求选择:

方案一:迁移到ViewPager2(官方推荐)

FragmentPagerAdapterFragmentStatePagerAdapter都已经被标记为弃用,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

火山引擎 最新活动