从API 27中不推荐使用FragmentStatePagerAdapter

MJM*_*MJM 29 android android-support-library fragmentstatepageradapter

FragmentStatePagerAdapter已从API 27中弃用。的替代方案是FragmentStatePagerAdapter什么?

private class MainPagerAdapter extends FragmentStatePagerAdapter {

        MainPagerAdapter(FragmentManager fm) {
            super(fm);
        }

        @Override
        public Fragment getItem(int position) {
            Fragment result = new DummyFragment();
             return result;
        }

        @Override
        public int getCount() {
            return 5;
        }

    }
Run Code Online (Sandbox Code Playgroud)

上面的代码显示FragmentStatePagerAdaptergetItemsuper(fm);已弃用

小智 41

以下构造函数执行相同的操作

super(@NonNull FragmentManager fm)
super(@NonNull FragmentManager fm, BEHAVIOR_SET_USER_VISIBLE_HINT)
Run Code Online (Sandbox Code Playgroud)

传递BEHAVIOR_SET_USER_VISIBLE_HINT得到了弃用。您应该BEHAVIOR_RESUME_ONLY_CURRENT_FRAGMENT改为通过。

通过这些区别在于FragmentPagerAdapter

 /**
 * Indicates that Fragment#setUserVisibleHint(boolean) will be 
 * called when the current fragment changes.
 */
@Deprecated
public static final int BEHAVIOR_SET_USER_VISIBLE_HINT = 0;

/**
 * Indicates that only the current fragment will be 
 * in the Lifecycle.State#RESUMED state. All other Fragments 
 * are capped at Lifecycle.State#STARTED.
 */
public static final int BEHAVIOR_RESUME_ONLY_CURRENT_FRAGMENT = 1;
Run Code Online (Sandbox Code Playgroud)

  • 这会以任何方式影响功能吗? (2认同)
  • 虽然现在已弃用 https://developer.android.com/reference/androidx/fragment/app/FragmentStatePagerAdapter (2认同)

Den*_*nko 28

您可以延长

androidx.fragment.app.FragmentStatePagerAdapter;
Run Code Online (Sandbox Code Playgroud)

并打电话

super(fragmentManager, BEHAVIOR_RESUME_ONLY_CURRENT_FRAGMENT);
Run Code Online (Sandbox Code Playgroud)

在类的构造函数中

  • 但它已被弃用。除了 FragmentStatePagerAdapter 还可以使用什么? (5认同)
  • 您能否检查您的导入:您使用的是androidx.fragment.app.FragmentStatePagerAdapter还是android.support.v4.app.FragmentStatePagerAdapter? (2认同)

Alo*_*pta 23

这对我有用。

在科特林:

class TasksPagerAdapter(fm: FragmentManager) : FragmentStatePagerAdapter(fm,BEHAVIOR_RESUME_ONLY_CURRENT_FRAGMENT )
Run Code Online (Sandbox Code Playgroud)

  • 我使用你的代码,但我收到 lint 错误“必须是 BEHAVIOR_RESUME_ONLY_CURRENT_FRAGMENT、BEHAVIOR_RESUME_ONLY_CURRENT_FRAGMENT 之一”,我该怎么办? (4认同)

Moi*_*nut 11

您需要MainPagerAdapter像这样添加行为:

super(fm, BEHAVIOR_RESUME_ONLY_CURRENT_FRAGMENT);


小智 5

仅以 FragmentManager 作为参数的构造函数被复制并更改为

public FragmentStatePagerAdapter(@NonNull FragmentManager fm,
        @Behavior int behavior)
Run Code Online (Sandbox Code Playgroud)

但是您可以通过使用下面的构造函数来实现相同的目的,您还应该通过构造函数注入 tabsNumber 以避免使用硬编码数字,并通过 getCount() 返回它。

public PagerAdapter(FragmentManager fm, int NumOfTabs) {
    super(fm, BEHAVIOR_RESUME_ONLY_CURRENT_FRAGMENT);
    this.numberOfTabs= NumOfTabs;
}

@Override
    public int getCount() {

        return numberOfTabs;
    }
Run Code Online (Sandbox Code Playgroud)

有关更多详细信息,请查看AndroidX的官方文档


Aza*_*pta 2

此类在 API 级别 27.1.0 中已弃用。这是支持 v13 https://developer.android.com/reference/android/support/v13/app/FragmentStatePagerAdapter

使用支持 v4 中的 FragmentStatePagerAdapter https://developer.android.com/reference/android/support/v4/app/FragmentStatePagerAdapter

  • FragmentStatePagerAdapter 也已弃用 (4认同)