从API 27中不推荐使用FragmentStatePagerAdapter

时间:2018-07-02 07:36:51

标签: 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;
        }

    }

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

10 个答案:

答案 0 :(得分:5)

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

public FragmentStatePagerAdapter(@NonNull FragmentManager fm,
        @Behavior int behavior)

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

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

@Override
    public int getCount() {

        return numberOfTabs;
    }

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

答案 1 :(得分:4)

您可以扩展

androidx.fragment.app.FragmentStatePagerAdapter;

并致电

super(fragmentManager, BEHAVIOR_RESUME_ONLY_CURRENT_FRAGMENT);

在您的类的构造函数中

答案 2 :(得分:2)

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

super(@NonNull FragmentManager fm)
super(@NonNull FragmentManager fm, BEHAVIOR_SET_USER_VISIBLE_HINT)

通过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;

答案 3 :(得分:2)

这对我有用。

在科特林:

Android.xml

答案 4 :(得分:2)

public static class MyAdapter extends FragmentStatePagerAdapter {
    public MyAdapter(FragmentManager fm) {
        super(fm, BEHAVIOR_RESUME_ONLY_CURRENT_FRAGMENT);
    }

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

    @Override
    public Fragment getItem(int position) {
        return ArrayListFragment.newInstance(position);
    }
}

See Reference developer.android.com

答案 5 :(得分:1)

答案 6 :(得分:1)

我知道这是一个老问题,但是现在两个FragmentStatePagerAdapter构造函数都已弃用。

相反,您可以扩展:

import androidx.viewpager2.adapter.FragmentStateAdapter

构造函数有点不同:

class DemoCollectionAdapter(fragment: Fragment) : FragmentStateAdapter(fragment) {
    
          override fun getItemCount(): Int = 3
    
          override fun createFragment(position: Int): Fragment {
            return when (position) {
                0 -> MyFragment()
                1 -> MyFragment2()
                2 -> MyFragment3()
            }
        }
    }

所以在片段中:

 class CollectionDemoFragment : Fragment() {
    private lateinit var demoCollectionAdapter: DemoCollectionAdapter
    private lateinit var viewPager: ViewPager2

    override fun onCreateView(
        inflater: LayoutInflater,
        container: ViewGroup?,
        savedInstanceState: Bundle?
    ): View? {
        return inflater.inflate(R.layout.collection_demo, container, false)
    }

    override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
        viewPager = view.findViewById(R.id.pager)
        val tabLayout = view.findViewById(R.id.tab_layout)
        demoCollectionAdapter = DemoCollectionAdapter(this)
        
        TabLayoutMediator(tabLayout, viewPager) { tab, position ->
            tab.text = when (position) {
            0 -> "Home"
            1 -> "Search"
            2 -> "Favorites"
        }
        }.attach()
        
        viewPager.adapter = demoCollectionAdapter
    }
}

并更改xml:

 <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:orientation="vertical">

    <com.google.android.material.tabs.TabLayout
        android:id="@+id/tab_layout"
        android:layout_width="match_parent"
        android:layout_height="wrap_content" />

    <androidx.viewpager2.widget.ViewPager2
        android:id="@+id/pager"
        android:layout_width="match_parent"
        android:layout_height="0dp"
        android:layout_weight="1" />

</LinearLayout>

检查它为官方documentation

答案 7 :(得分:0)

根据Documentation,不推荐使用android.support.v13.app.FragmentPagerAdapter。

您可以将其替换为android.support.v4.app.FragmentPagerAdapter。

Check this out用于正式离职。

答案 8 :(得分:0)

您需要在MainPagerAdapter中添加如下行为:

super(fm, BEHAVIOR_RESUME_ONLY_CURRENT_FRAGMENT);

答案 9 :(得分:0)

FragmentStatePagerAdapterFragmentPagerAdapter 均已弃用。我们需要使用 ViewPager2 + FragmentStateAdapter,因为 AndroidX

这里有两种实现上述的方法:

  1. 此链接是一个广泛的解决方案,包括使用 TabLayout 实现 ViewPager2。这还包括整个过程中的各种更新
  1. 本教程是解决该问题的相对简单的实现,并讨论了使用 ViewPager2
  2. 实现 Fragment 的方法

这两种解决方案都有效。也请阅读 documentation 以获得更好的理解。